# Copyright (C) 2003-2005 Kouichirou Eto, All rights reserved.

$LOAD_PATH << "../../lib" unless $LOAD_PATH.include?("../../lib")

module Qwik
  class Action
    def plg_member_user(arg=nil)
      return @req.user
    end

    def plg_member_add
      return "" if @req.query.nil?
      tomail = @req.query["tomail"]
      return member_add_go(tomail) if tomail
      plg_member_add_form
    end

    def plg_member_add_form(dest="")
      pagename = @req.base
      user = plg_login_user
      [:form, {:action=>pagename+".html"},
	[:p, "新規メンバーを追加します。"],
	[:dl,
	  [:dt, "あなたのメール"],
	  [:dd, user],
	  [:dt, "追加メール"],
	  [:dd, [:input, {:name=>"tomail"}]],
	  [:dd, "追加したい人のメールアドレスを入力してください。"],
	  [:dd, [:input, {:value=>"追加", :type=>"submit"}]]]]
    end

    def plg_member_add_go(tomail)
      goback = "\n:メール:#{tomail}\nブラウザの「戻るボタン」で入力画面に戻り、もう一度入力を確認してください。\n"

      if tomail.nil? || !MailAddress.new(tomail).valid?
	return c_res("** メンバーは追加されませんでした。#{goback}")
      end

      if @site.member.exist?(tomail)
	return c_res("** メンバーはすでに追加されているようです。#{goback}")
      end

      @site.member.add(tomail, @req.user)

      if !@site.member.exist?(tomail)
	return c_res("** メンバー追加エラー\nシステム管理者にご連絡下さい。")
      end

      return c_res("** メンバーは追加されました。\n:メール:#{tomail}\n")
    end

    def plg_member_list
      list = @site.member.list
      msg = "total: "+list.length.to_s+" member"
      msg += "s" if 1 < list.length
      e = []
      list.sort.each {|user|
	user = user.dup # unfreeze
	e << [:li, user]
      }
      [[:ul, e], [:p, msg]]
    end

    CSV_DIVIDE = 50
    def plg_member_list_csv
      list = @site.member.list
      str = ""
      c = 0
      list.sort.each {|user|
	str += user
	c += 1
	if c % CSV_DIVIDE == 0
	  str += "\n"
	else
	  str += ", "
	end
      }
      [:textarea, {:class=>"memberlist"}, str]
    end
  end
end

if $0 == __FILE__
  require "t/test"
  $debug = true
end

if $debug
  class TC_ActMember < Test::Unit::TestCase
    include TestSession

    def test_member_plugin_unit
      assert_wiki([:form, {:action=>"1.html"},
		    [:p, "新規メンバーを追加します。"],
		    [:dl,
		      [:dt, "あなたのメール"],
		      [:dd, [:em, "user@e.com"]],
		      [:dt, "追加メール"],
		      [:dd, [:input, {:name=>"tomail"}]],
		      [:dd, "追加したい人のメールアドレスを入力してください。"],
		      [:dd, [:input, {:value=>"追加", :type=>"submit"}]]]],
		  "{{member_add}}")
    end

    def nutest_member_plugin
      t_add_user

      session("/test/_MemberAdd.html")
      assert_text("MemberAdd - example.com/test", "title")
      assert_attr({"action"=>"_MemberAdd.html"}, "form")

      session("/test/_MemberAdd.html", {"tomail"=>"guest@example.com"})
      assert_text("メンバーは追加されました。", "h3")
      assert_equal(true, @site.member.exist?("guest@example.com"))
      assert_equal(",user@e.com,\n,guest@example.com,user@e.com\n", @site["_SiteMember"].load)

      assert_wiki("user@e.com", "{{member_user}}")
      assert_wiki("<ul><li>guest@example.com</li><li>user@e.com</li></ul><p>total: 2 members", "{{member_list}}")
      assert_wiki(/<textarea/, "{{member_list_csv}}")
      assert_wiki(/guest@example.com, user@e.com/, "{{member_list_csv}}")
    end
  end
end
