package jp.co.y_net.amm.page;

import jp.co.y_net.amm.AppSession;
import jp.co.y_net.amm.AppSession.LoginUser;
import jp.co.y_net.amm.common.AppStringUtils;
import jp.co.y_net.amm.common.AppUtils;
import jp.co.y_net.amm.common.InfoRenderer;
import jp.co.y_net.amm.dao.Inf;
import jp.co.y_net.amm.dao.Usr;

import org.apache.commons.lang.StringUtils;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
import org.apache.wicket.ajax.markup.html.form.AjaxButton;
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.Form;
import org.apache.wicket.markup.html.form.TextArea;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.request.mapper.parameter.PageParameters;

public class InfoEntryPage extends CommonFrameA {
	private static final long serialVersionUID = 1L;
	
	/*
	 * 画面入力値
	 */
	private String infotitleValue;
	private String infobodyValue;

	/*
	 * 画面の状態
	 */
	private boolean complete = false;

    /**
     * ログインチェック定義
     * @see jp.co.y_net.amm.page.AppPage#validateLogin()
     */
    @Override
    public boolean validateLogin() {
        if(AppSession.get().isLogin()) {
            if(AppSession.get().getLoginUser().getKind().equals(Usr.KIND_運営管理者)) {
                return true;
            }
        }
        return false;
    }
	
    public InfoEntryPage(PageParameters params) {
        
        /* 共通戻るリンクの設置 */
        createCommonBackLinks();
        
        /* 画面固有の戻るボタンの設置 */
        createBackLink(InfoListPage.class, "お知らせ管理");
        
        /* フィードバックパネルの設置 */
        createFeedbackPanel();
        
        /* 入力フォーム */
        Form<Void> form  = new Form<Void>("form");
        add(form);
        
        /* お知らせ編集の時はパラメータが指定されるのでチェック */
        String paramInfid = params.get("infid").toString("");
        final Inf targetInf;
        if(StringUtils.isEmpty(paramInfid)) {
            targetInf = null;
        } else {
            Integer targetInfid =  AppUtils.toInteger(paramInfid);
            targetInf = infDao.getByInfid(targetInfid);
        }
        if(targetInf != null) {
            infotitleValue = targetInf.getTitle();
            infobodyValue = targetInf.getBody();
        }
        
        
        /* 初期表示エラーチェック・共通変数設定 --------------------------------------------------------------------- */
        form.setVisible(false); // Formはエラーチェックが完了するまで非表示とする。
        
        final LoginUser loginUser  = AppSession.get().getLoginUser();
        if(loginUser == null) {
            error("ログイン情報が取得できません。");
            return;
        }
        final Integer loginUserId = loginUser.getUsrid();
        
        if(hasInputError()) return; // ----------エラーがあれば中止
        form.setVisible(true);
        
        /* Form内の設定 ----------------------------------------------------------------------------------------------*/
        /* 完了メッセージ */
        Model<String> resultMessageModel = new Model<String>() {
            @Override
            public String getObject() {
                if(complete) {
                    return "登録しました。";
                }
                return "";
            }
        };
        final Label resutlMessage = new Label("resutlMessage", resultMessageModel);
        form.add(resutlMessage);
        
        /* コンテナの設定 ----------------------------------------------------------------------------------*/
        final WebMarkupContainer cntPreview = new WebMarkupContainer("cntPreview");
        cntPreview.setOutputMarkupId(true);
        form.add(cntPreview);
        
        /* 入力コンポーネントの設定 ----------------------------------------------------------------------------------*/
        
        final TextField<String> infotitle = new TextField<String>("infotitle", new PropertyModel<String>(this, "infotitleValue"));
        form.add(infotitle);
        
        final TextArea<String> infobody = new TextArea<String>("infobody", new PropertyModel<String>(this, "infobodyValue"));
        infobody.setEscapeModelStrings(false);
        form.add(infobody);
        
        /* 表示項目の設定 ----------------------------------------------------------------------------------*/
        
        Model<String> modelPreview = new Model<String>() {
            @Override
            public String getObject() {
                Inf previewInf = new Inf();
                previewInf.setTitle(infotitle.getValue());
                previewInf.setBody(infobody.getValue());
                if(targetInf != null) {
                    previewInf.setPubdate(targetInf.getPubdate());
                }
                return InfoRenderer.execute(previewInf);
            }
        };
        final Label preview = new Label("preview", modelPreview) {};
        preview.setVisible(false); // 初期 非表示
        preview.setEscapeModelStrings(false);
        cntPreview.add(preview);
        
        final Label wordcount = new Label("wordcount", new Model<String>(){
            @Override
            public String getObject() {
                String body = infobody.getValue();
                int bodyCount = body == null ? 0 :body.length();
                return "あと" + (Inf.DEFお知らせ本文の文字数 - bodyCount) + "文字入力できます。";
            }
            
        });
        wordcount.setOutputMarkupId(true);
        form.add(wordcount);
        
        /* その他の振る舞い ------------------------------------------------------------------------------------------*/
        
        /* 本文が入力されたら残り文字数をリアルタイムで再描画する */
        infobody.add(new AjaxFormComponentUpdatingBehavior("onKeyUp") {
            @Override
            protected void onUpdate(AjaxRequestTarget target) {
                target.add(wordcount);
            }
        });
        
        
        /* 処理ボタン定義 --------------------------------------------------------------------------------------------*/
        Button btnRegist = new Button("btnRegist") {
            @Override
            public void onSubmit() {
                
                /* モデル(PropertyModel以外)から値取得 */
                // なし
                
                /* 入力値変換 */
                infotitleValue = AppStringUtils.trim(infotitleValue);
                infobodyValue = AppStringUtils.trim(infobodyValue);
                
                /* 入力値検査 */
                validItem(infotitleValue, "タイトル", 1, 512);
                validItem(infobodyValue, "本文", 1, Inf.DEFお知らせ本文の文字数);
                
                if(hasInputError()) return; // ここまででエラーチェック
                
                /* データアクセス */
                if(targetInf == null) {
                    /* 新規作成 */
                    Inf item = new Inf();
                    item.setTitle(infotitleValue);
                    item.setBody(infobodyValue);
                    item.setPubdate(AppUtils.createNowLong()); // 現在日時
                    item.setStatus(Inf.STATUS_掲載中);
                    infDao.add(item, loginUserId); // データ更新
                } else {
                    
                    /* データ更新 */
                    targetInf.setTitle(infotitleValue);
                    targetInf.setBody(infobodyValue);
                    infDao.update(targetInf, loginUserId); // データ更新
                }

                
                /* 完了状態へ移行 */
                complete = true;
            }
            @Override
            public boolean isVisible() {
                if(complete == true) {
                    return false;
                }
                return true;
            }
        };
        form.add(btnRegist);
        
        AjaxButton btnPreview = new AjaxButton("btnPreview") {
            private static final long serialVersionUID = 1L;
            @Override
            protected void onSubmit(AjaxRequestTarget target, Form<?> form){
                preview.setVisible(true);
                target.add(cntPreview); // プレビュー再描画
            }
            @Override
            protected void onError(AjaxRequestTarget target, Form<?> form) {
                /* エラーハンドリングなし */
            }
        };
        form.add(btnPreview);

        
    }

}
