package jp.co.y_net.amm.page;

import java.util.List;

import jp.co.y_net.amm.AppSession;
import jp.co.y_net.amm.common.AppStringUtils;
import jp.co.y_net.amm.common.AppUtils;
import jp.co.y_net.amm.common.CalcHash;
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 jp.co.y_net.amm.dao.Pwtckt;
import jp.co.y_net.amm.dao.Usr;

import org.apache.wicket.ajax.AjaxRequestTarget;
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.PasswordTextField;
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;
import org.apache.wicket.request.mapper.parameter.PageParameters;

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

    /*
     * 画面入力値
     */
    public String passwordValue;
    public String password2Value;
    
    /*
     * 画面の状態
     */
    private boolean complete = false;
	
	public EntryPasswordPage(PageParameters pageParams) {

	    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);
        form.setVisible(false); // エラーチェックが完了するまで非表示とする。
        add(form);
        
        /* パラメータチェック ------------------------------------------- */
        String paramValue = pageParams.get("value").toString();
        validItem(paramValue, "パラメータvalue", 1, 16);
        //if(hasInputError()) return; 
        if(hasInputError()) {
            /* 有効文字数を表示してしまう具体的なエラーメッセージを避ける */
            AppSession.get().getFeedbackMessages().clear();
            error("このＵＲＬは無効です。");
            return;
        }
        
        /*  有効なランダムチケットが無い場合は、メッセージを表示する。*/
        Pwtckt cnd = new Pwtckt();
        cnd.setTicket(paramValue);
        final Pwtckt dbTicket;
        List<Pwtckt> tickets = pwtcktDao.get(cnd);
        if(tickets.size() != 1) {
            error("このＵＲＬは無効です。");
            return;
        } else {
            dbTicket = tickets.get(0);
        }
        if(dbTicket.getStatus().equals(Pwtckt.STATUS_受付中) == false) {
            error("このＵＲＬは無効です。");
            return;
        }
        if(dbTicket.getTicketdate() < AppUtils.createNowLong()) {
            error("このＵＲＬは期限切れです。もう一度手続きを行ってください。");
            
            dbTicket.setStatus(Pwtckt.STATUS_有効期限切れ);
            pwtcktDao.update(dbTicket, AppDef.USERID_NONE); // 【更新処理】
            
            return;
        }
        
        form.setVisible(true); 
        /* -------------------------------------------------------------------------------------------------------*/
        /* Form内の設定 */
        
        /* 完了メッセージ */
        Model<String> resultMessageModel = new Model<String>() {
            @Override
            public String getObject() {
                //String msg = "パスワードを登録してください。<br />パスワード登録後、本登録完了となります。<br />パスワードは8文字以上、16文字以内で入力してください。";
                String msg = "パスワードを登録してください。<br />パスワードは8文字以上、16文字以内で入力してください。";
                if(complete) {
                    msg = "パスワードの登録が完了しました。";
                }
                return msg;
            }
        };
        final Label resutlMessage = new Label("resutlMessage", resultMessageModel);
        resutlMessage.setEscapeModelStrings(false);
        form.add(resutlMessage);
        
        PasswordTextField password = new PasswordTextField("password", new PropertyModel<String>(this, "passwordValue")){
            @Override
            public boolean isVisible() {
                /* 完了後の状態なら表示しない */
                return complete == false;
            }
        };
        form.add(password);
        PasswordTextField password2 = new PasswordTextField("password2", new PropertyModel<String>(this, "password2Value")){
            @Override
            public boolean isVisible() {
                /* 完了後の状態なら表示しない */
                return complete == false;
            }
        };
        form.add(password2);
        
        Button btnSubmit = new ConfirmAjaxButton("btnSubmit"){
            @Override
            protected String getConfirmMessage() {
                return "パスワードを登録します。";
            }
            @Override
            boolean executeBefore() {
                /* 入力値変換 */
                passwordValue = AppStringUtils.trim(passwordValue);
                password2Value = AppStringUtils.trim(password2Value);
                
                /* 入力値チェック */
                validItemAscii(passwordValue, "パスワード", 8, 16);
                validItemAscii(password2Value, "パスワード確認用", 8, 16);
                if(passwordValue.equals(password2Value) == false) {
                    error("入力されたパスワードが一致しません。");
                }
                if(hasInputError()) return false; // ここまででエラーチェック
                return true;
            }
            @Override
            void executeAfter(AjaxRequestTarget target) {
                /* データアクセス 機関申請者のパスワード登録 */
                Usr usr = usrDao.getByUsrid(dbTicket.getUsrid());
                if(usr == null) {
                    error("（ユーザ情報が登録されていません。）");
                    return;
                }
                if(Usr.STATUS_退会 == usr.getStatus()) {
                    /* 仮登録中に退会処理をされた場合を考慮 */
                    error("（ユーザ情報が取り消されています。）");
                    return;
                }
                
                /* ユーザ情報更新 */
                String pwhash = CalcHash.passowrdHash(passwordValue, usr.getLoginid());
                usr.setPwhash(pwhash);
                usr.setModpwdate(AppUtils.createNowLong());
                usr.setJoindate(AppUtils.createNowLong()); // 入会日時
                usr.setStatus(Usr.STATUS_登録済み);
                
                usrDao.update(usr, AppDef.USERID_NONE); // 【更新処理】
                
                
                /* 機関情報更新 */
                Org org = orgDao.getByOrgid(usr.getOrgid());
                if(org == null) {
                    error("（組織情報が登録されていません。）");
                    return;
                }
                org.setStatus(Org.STATUS_本登録済み);
                org.setJoindate(AppUtils.createNowLong()); // 本登録日時
                
                orgDao.update(org, AppDef.USERID_NONE); // 【更新処理】
                
                
                /* パスワード受付管理情報更新 */
                dbTicket.setStatus(Pwtckt.STATUS_完了);
                dbTicket.setCompletedate(AppUtils.createNowLong());
                
                pwtcktDao.update(dbTicket, AppDef.USERID_NONE); // 【更新処理】
                
                
                /* 完了状態へ移行 */
                complete = true;
                
                /* 画面コンポーネントの再描画 */
                target.add(form);
            }
            @Override
            public boolean isVisible() {
                /* 完了後の状態ならボタンを表示しない */
                return complete == false;
            }
        };
        form.add(btnSubmit);
        
    }
	
}
