package jp.co.y_net.amm.page;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import jp.co.y_net.amm.common.AppLogger;
import jp.co.y_net.amm.common.AppSendMail;
import jp.co.y_net.amm.common.AppSendMail.MailSetting;
import jp.co.y_net.amm.common.AppStringUtils;
import jp.co.y_net.amm.common.AppUtils;
import jp.co.y_net.amm.common.ChoiceElement;
import jp.co.y_net.amm.common.ResourceReader;
import jp.co.y_net.amm.dao.AppDef;
import jp.co.y_net.amm.dao.Org;

import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Button;
import org.apache.wicket.markup.html.form.CheckBox;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.TextArea;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.link.ExternalLink;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.request.mapper.parameter.PageParameters;

public class OrgEntryPage extends CommonFrameA {
	private static final long serialVersionUID = 1L;
	
    /*
     * 画面入力値
     */
	public String kindValue;
	public String nameValue;
	public String adminnameValue;
	public String adminnamekanaValue;
	public String postnumValue;
	public String addressValue;
	public String telnumValue;
	public String mailValue;
	public String mail2Value; 
	public boolean agreeValue;
	
	/*
     * 画面の状態
     */
	/* 会員の種別選択完了 */
	private boolean completeKind = false;
	/* 申請完了 */
    private boolean complete = false;
	
    public OrgEntryPage(PageParameters params) {
        

        /* トップへ戻る */
        add(new ExternalLink("lnkTop", ResourceReader.getStringQuick("url.back.top")));
        
        /* フィードバックメッセージ */
        final FeedbackPanel feedbackPanel = new FeedbackPanel("feedback");
        feedbackPanel.setOutputMarkupId(true);
        add(feedbackPanel);
        
        /* 入力フォーム */
        final Form<Void> form  = new Form<Void>("form");
        form.setOutputMarkupId(true);
        add(form);
        
        /*
         * 機能制御
         */
        if (ResourceReader.getBooleanQuick("enable.orgentry") == false) {
            form.setVisible(false);
            error("現在この機能はご利用いただけません。");
            return;
        }
        
        
        /* 完了メッセージ */
        Model<String> resultMessageModel = new Model<String>() {
            @Override
            public String getObject() {
                String msg = "";
//                if(completeKind == false) {
//                    msg = "会員の種別を選択してください。";
//                } else if(complete == false) {
//                    msg = "申請内容を入力してください。";
//                } else {
//                    msg = "申請を行いました。申請の結果は連絡先メールアドレスへお送りします。しばらくお待ちください。";
//                }
                return msg;
            }
        };
        info("会員の種別を選択してください。");
        final Label resutlMessage = new Label("resutlMessage", resultMessageModel);
        form.add(resutlMessage);
        
        /* 入力コンポーネント定義 ---------------------------------------------------------------------------------*/
        
        /* 会員の種別 ---------------------------------------------------------- */
        
        WebMarkupContainer tableKind = new WebMarkupContainer("tableKind"){
            @Override
            public boolean isVisible() {
                /* 会員の種別選択されていれば表示しない */
                if(completeKind == true) {
                    return false;
                }
                return true;
            }
        };
        form.add(tableKind);
        
        /* 会員の種類 */
        List<ChoiceElement> choiceKind = new ArrayList<ChoiceElement>();
        choiceKind.add(new ChoiceElement(" ",""));
        Map<String, String> map = Org.getOrgkindMap();
        for(Entry<String, String> e: map.entrySet()) {
            choiceKind.add(new ChoiceElement(e.getKey(), e.getValue()));
        }
        final Model<ChoiceElement> kindModel = new Model<ChoiceElement>();
        ChoiceElement.setDropDownList(kindModel, choiceKind, " "); // 初期値設定
        
        final DropDownChoice<ChoiceElement> kind = new DropDownChoice<ChoiceElement>(
                "kind", kindModel, choiceKind, new ChoiceElement.Renderer());
        tableKind.add(kind);
        
        /* 会員の種別 以外---------------------------------------------------------- */
        
        WebMarkupContainer tableMain = new WebMarkupContainer("tableMain") {
            @Override
            public boolean isVisible() {
                /* 会員の種別が未選択の時は表示しない */
                if(completeKind == false) {
                    return false;
                }
                return true;
            }
        };
        form.add(tableMain);
        
        Label thAdminname = new Label("thAdminname", new Model<String>(){
            @Override
            public String getObject() {
                if(Org.KIND_PERSONAL_STR.equals(kindModel.getObject().getId()) == false) {
                    return "担当者";
                }
                return "氏名";
            }
        }){
        };
        tableMain.add(thAdminname);
        
        /* 会員の種別（表示用）*/
        Label selectedKind = new Label("selectedKind", new Model<String>(){
            @Override
            public String getObject() {
                String kindname = Org.getOrgkindMap().get(kindModel.getObject().getId());
                return kindname;
            }
            
        });
        tableMain.add(selectedKind);
        
        /* 会員種別を選び直す */
        final Link<Void> selectedKindBack = new Link<Void>("selectedKindBack") {
            @Override
            public void onClick() {

                /* 入力値変換 */
                // なし
                
                /* 自画面再読み込み */
                setResponsePage(getPage().getClass());
            }
            @Override
            public boolean isVisible() {
                /* 完了後の状態ならボタンを表示しない */
                return complete == false;
            }
            
        };

        tableMain.add(selectedKindBack);
        
        /* 団体名称 */
        TextField<String> name = new TextField<String>("name", new PropertyModel<String>(this, "nameValue")){
            @Override
            public boolean isVisible() {
                if(Org.KIND_PERSONAL_STR.equals(kindModel.getObject().getId())) { // 個人の場合は非表示
                    return false;
                }
                return true;
            }
        };
        tableMain.add(name);
        
        /* 申請者氏名 */
        TextField<String> adminname = new TextField<String>("adminname", new PropertyModel<String>(this, "adminnameValue"));
        tableMain.add(adminname);
        
        /* ふりがな */
        TextField<String> adminnamekana = new TextField<String>("adminnamekana", new PropertyModel<String>(this, "adminnamekanaValue"));
        tableMain.add(adminnamekana);
        
        /* 郵便番号 */
        TextField<String> postnum = new TextField<String>("postnum", new PropertyModel<String>(this, "postnumValue"));
        tableMain.add(postnum);
        
        /* 連絡先住所 */
        TextField<String> address = new TextField<String>("address", new PropertyModel<String>(this, "addressValue"));
        tableMain.add(address);
        
        /* 連絡先電話番号 */
        TextField<String> telnum = new TextField<String>("telnum", new PropertyModel<String>(this, "telnumValue"));
        tableMain.add(telnum);
        
        /* 連絡先メールアドレス */
        TextField<String> mail = new TextField<String>("mail", new PropertyModel<String>(this, "mailValue"));
        tableMain.add(mail);
        
        /* 連絡先メールアドレス確認用 */
        TextField<String> mail2 = new TextField<String>("mail2", new PropertyModel<String>(this, "mail2Value"));
        tableMain.add(mail2);

        /* 利用規約 */
        TextArea<String> termsofuse = new TextArea<String>("termsofuse", Model.of(ResourceReader.getText("message/termsofuse")));
        tableMain.add(termsofuse);
        
        final Model<Boolean> agreeModel = Model.of(false);
        CheckBox agree = new CheckBox("agree", agreeModel);
        tableMain.add(agree);
        
        /* 処理ボタン定義 --------------------------------------------------------------------------------------------*/
        final Button btnCancel = new Button("btnCancel"){
            @Override
            public void onSubmit() {
                /* 入力値変換 */
                // なし
                
                /* 自画面再読み込み */
                setResponsePage(getPage().getClass());
            }
            @Override
            public boolean isVisible() {
                /* 完了後の状態ならボタンを表示しない */
                return complete == false;
            }
        };
        form.add(btnCancel);
        
        Button btnSubmitKind = new Button("btnSubmitKind") {
            @Override
            public void onSubmit() {
                /* 入力値変換 */
                kindValue = AppStringUtils.trim(kindModel);
                
                /* 入力値検査 */
                validItemNum(kindValue, "会員の種類", 1, 1);
                
                if(hasInputError()) return; // ここまででエラーチェック
                
                /* メッセージ表示 */
                info("申請内容を入力してください。");
                
                /* 状態遷移 */
                completeKind = true;
            }
            @Override
            public boolean isVisible() {
                if(completeKind == true) {
                    return false;
                }
                if(complete == true) {
                    return false;
                }
                return true;
            }
        };
        form.add(btnSubmitKind);
        
        Button btnSubmit = new ConfirmAjaxButton("btnSubmit"){
            @Override
            protected String getConfirmMessage() {
                return "申請を行います。";
            }
            
            @Override
            boolean executeBefore() {
                /* モデル(PropertyModel以外)から値取得 */
                // なし
                
                /* 入力値変換 */
                kindValue = AppStringUtils.trim(kindModel);
                nameValue = AppStringUtils.trim(nameValue);
                adminnameValue = AppStringUtils.trim(adminnameValue);
                adminnamekanaValue = AppStringUtils.trim(adminnamekanaValue);
                postnumValue = AppStringUtils.trimHalf(postnumValue);
                postnumValue = postnumValue.replaceAll("-", "");// 郵便番号からハイフン除去
                addressValue = AppStringUtils.trim(addressValue);
                telnumValue = AppStringUtils.trimHalf(telnumValue);
                mailValue = AppStringUtils.trimHalf(mailValue);
                mail2Value = AppStringUtils.trimHalf(mail2Value);
                agreeValue = agreeModel.getObject();
                
                /* 入力値検査 */
                validItemNum(kindValue, "会員の種類", 1, 1);
                if(hasInputError()) return false; // ここまででエラーチェック
                
                int iKindValue = AppUtils.toInteger(kindValue);
                if(Org.KIND_PERSONAL != iKindValue) {
                    validItem(nameValue, "申請機関・団体", 1, 512);
                    validItem(adminnameValue, "担当者", 1, 512);
                } else {
                    // 個人の場合は入力しない validItem(nameValue, "申請機関・団体", 1, 512);
                    validItem(adminnameValue, "氏名", 1, 512);
                }
                
                validItem(adminnamekanaValue, "ふりがな", 1, 512);
                validItemNum(postnumValue, "連絡先郵便番号", 7, 7);
                validItem(addressValue, "連絡先住所", 1, 1024);
                validItemTel(telnumValue, "連絡先電話番号", 1, 32);
                validItemMail(mailValue, "連絡先メールアドレス", true); // フリーメールチェック
                validItemMail(mail2Value, "メールアドレス確認用");
                
                if(hasInputError()) return false; // ここまででエラーチェック
                

                /* メールチェック */
                if(mailValue.equals(mail2Value) == false) {
                    error("連絡先メールアドレスが一致しません。");
                }

                if(mailAddressCheck.exist(mailValue)) {
                    error("この連絡先メールアドレスは既に使用されています。");
                }
                
                if(hasInputError()) return false; // ここまででエラーチェック
                
                if(agreeValue == false) {
                    error("利用規約に承諾しない場合は申請できません。");
                }
                
                if(hasInputError()) return false; // ここまででエラーチェック
                
                return true;
            }

            @Override
            void executeAfter(AjaxRequestTarget target) {
                /* データアクセス 新規機関申請 */
                Org org = new Org();
                org.setKind(Integer.parseInt(kindValue));
                org.setName(nameValue);
                org.setAdminname(adminnameValue);
                org.setAdminnamekana(adminnamekanaValue);
                org.setPostnum(postnumValue);
                org.setTelnum(telnumValue);
                org.setAddress(addressValue);
                org.setMail(mailValue);
                org.setEntrydate(AppUtils.createNowLong());
                org.setStatus(Org.STATUS_未処理);
                
                orgDao.add(org,AppDef.USERID_NONE); // 【データ更新】
                
                /*
                 * 新着申請内容受信メール送信
                 * 
                 *・送信先 別紙参照 設定値一覧 新規機関申請通知先メールアドレス
                 *・申請画面URL http://～/orgentrydetail?orgid={機関ID}
                 */
                MailSetting setting = new MailSetting();
                setting.setTemplate(ResourceReader.getText("message/mail.orgentry"));
                setting.setMailTo(ResourceReader.getStringQuick("mailto.orgentry"));
                String 申請画面URL = ResourceReader.getStringQuick("urlroot") + "orgentrydetail?orgid=" + org.getOrgid();
                setting.replace("申請画面URL", 申請画面URL);
                boolean sendmailrsult = AppSendMail.send(setting);
                if(sendmailrsult == false) {
                    error("メールの送信に失敗しました。");
                }
                
                /* テスト自動化対応 */
                if (AppLogger.isDebug()) {
                    //info("メールに記載したURL【" + 本登録URL + "】");
                    addDebugUrl(申請画面URL);
                }
                
                /* メッセージ表示 */
                info("申請を行いました。申請の結果は連絡先メールアドレスへお送りします。しばらくお待ちください。");
                
                /* 画面コンポーネントの再描画 */
                target.add(form);
                
                
                /* 完了状態へ移行 */
                complete = true;
            }
            @Override
            public boolean isVisible() {
                if(completeKind == false) {
                    return false;
                }
                if(complete == true) {
                    return false;
                }
                return true;
            }
        };
        form.add(btnSubmit);
        

    }


}
