package jp.co.y_net.amm.page;

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.ResourceReader;
import jp.co.y_net.amm.dao.Org;
import jp.co.y_net.amm.dao.Usr;

import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Button;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.link.ExternalLink;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;

public class PasswordResetPage extends CommonFrameA {
	private static final long serialVersionUID = 1L;

	/*
     * 画面入力値
     */
    public String mailValue;
    
    /*
     * 画面の状態
     */
    private boolean complete = false;
	
	public PasswordResetPage() {
	    
        /* トップへ戻る */
        add(new ExternalLink("lnkTop", ResourceReader.getStringQuick("url.back.top")));
        
        add(new FeedbackPanel("feedback"));
        
        Form<Void> form  = new Form<Void>("form");
        add(form);
        

        
        /* 完了メッセージ */
        Model<String> resultMessageModel = new Model<String>() {
            @Override
            public String getObject() {
                if(complete) {
                    return "パスワード再設定用のメールを送りました。ご確認ください。";
                }
                return "登録したメールアドレスを入力してください。<br />"+
"入力されたメールアドレス宛てにメールをお送りします。<br />" + 
"メール内のリンクからパスワードを再設定してください。<br />";
            }
        };
        final Label resutlMessage = new Label("resutlMessage", resultMessageModel);
        resutlMessage.setEscapeModelStrings(false);
        form.add(resutlMessage);
        
        /* 入力コンポーネント定義 ---------------------------------------------------------------------------------*/
        TextField<String> mail = new TextField<String>("mail", new PropertyModel<String>(this, "mailValue"));
        form.add(mail);
        
        /* 処理ボタン定義 --------------------------------------------------------------------------------------------*/
        final Button btnSubmit = new Button("btnSubmit"){
            @Override
            public void onSubmit() {
                
                /* 入力値変換 */
                mailValue = AppStringUtils.trimHalf(mailValue);
                
                /* 入力値検査 */
                validItemMail(mailValue, "メールアドレス");
                
                if(hasInputError()) return; // ここまででエラーチェック
                
                Usr usr = usrDao.getByLoginid(mailValue);
                if(usr == null) {
                    error("このメールアドレスは登録されていません。");
                }
                
                if(hasInputError()) return; // ここまででエラーチェック
                
                if(usr.getStatus() == Usr.STATUS_退会) {
                    error("退会しています。");
                }
                if(usr.isログイン停止()) {
                    error("ログイン停止中です。"); 
                }
                Integer orgId = usr.getOrgid();
                Org org = orgDao.getByOrgid(orgId);
                if(org==null) {
                    AppLogger.error(usr.getLoginid() + "に組織情報が紐づいていません。");
                    error("エラーが発生しました。");
                }
                if(org != null && org.is利用可能期間内() == false) {
                    error("利用可能期間外です。");
                }
                
                if(hasInputError()) return; // ここまででエラーチェック
                
                /* 共通機能：パスワード登録チケット発行 からチケットを取得する */
                String random = passwordTicketManager.executeパスワードリセット(usr.getUsrid());
                
                /* パスワード再設定用メールを送信する */
                MailSetting setting = new MailSetting();
                setting.setTemplate(ResourceReader.getText("message/mail.resetpw"));
                setting.setMailTo(mailValue);
                String パスワード登録画面のURL = ResourceReader.getStringQuick("urlroot") + "entrypassword?value=" + random;
                setting.replace("パスワード登録画面のURL", パスワード登録画面のURL);
                boolean sendmailrsult = AppSendMail.send(setting);
                if(sendmailrsult == false) {
                    error("メールの送信に失敗しました。");
                }
                
                /* テスト自動化対応 */
                if (AppLogger.isDebug()) {
                    //info("メールに記載したURL【" + パスワード登録画面のURL + "】");
                    addDebugUrl(パスワード登録画面のURL);
                }
                
                /* 完了状態へ遷移 */
                complete = true;
            }
            @Override
            public boolean isVisible() {
                /* 完了後の状態ならボタンを表示しない */
                return complete == false;
            }
        };
        form.add(btnSubmit);
    }

	
	
}
