package jp.co.y_net.amm;

import jp.co.y_net.amm.api.ApiChallengestring;
import jp.co.y_net.amm.api.ApiDatainitialize;
import jp.co.y_net.amm.api.ApiGroupmember;
import jp.co.y_net.amm.api.ApiInfo;
import jp.co.y_net.amm.api.ApiLogincheck;
import jp.co.y_net.amm.api.ApiLogout;
import jp.co.y_net.amm.api.ApiMember;
import jp.co.y_net.amm.api.ApiMembergroup;
import jp.co.y_net.amm.common.AppLogger;
import jp.co.y_net.amm.page.DashboardPage;
import jp.co.y_net.amm.page.EntryPasswordPage;
import jp.co.y_net.amm.page.ErrorPage;
import jp.co.y_net.amm.page.GroupListPage;
import jp.co.y_net.amm.page.InfoListPage;
import jp.co.y_net.amm.page.InfoPage;
import jp.co.y_net.amm.page.LoginPage;
import jp.co.y_net.amm.page.MemberDetailPage;
import jp.co.y_net.amm.page.MemberListPage;
import jp.co.y_net.amm.page.OrgDetailPage;
import jp.co.y_net.amm.page.OrgEntryDetailPage;
import jp.co.y_net.amm.page.OrgEntryListPage;
import jp.co.y_net.amm.page.OrgEntryPage;
import jp.co.y_net.amm.page.OrgMemberListPage;
import jp.co.y_net.amm.page.PasswordResetPage;
import jp.co.y_net.amm.page.TopPage;

import org.apache.wicket.Page;
import org.apache.wicket.RuntimeConfigurationType;
import org.apache.wicket.protocol.http.WebApplication;
import org.apache.wicket.request.Request;
import org.apache.wicket.request.Response;
import org.apache.wicket.spring.injection.annot.SpringComponentInjector;

/**
 * アプリケーション設定クラス
 */
public class WicketApplication extends WebApplication {
//AuthenticatedWebApplication {

    @Override
    public Class<? extends Page> getHomePage() {
        return TopPage.class;
    }
    @Override
    protected void init() {
        super.init();
        
        getRequestCycleSettings().setResponseRequestEncoding("UTF-8");
        getMarkupSettings().setDefaultMarkupEncoding("UTF-8");
        /* Wicket上でStringBeanを使用できるようにする */
        getComponentInstantiationListeners().add(new SpringComponentInjector(this));
        /* Aタグ非表示時にEMタグが表示されるのを回避 */
        getMarkupSettings().setDefaultBeforeDisabledLink("");
        getMarkupSettings().setDefaultAfterDisabledLink("");

        /* マウント 定義 -------------------------------------------------------------------------------------------*/
        
        /* 直接呼び出される可能性のあるものを定義 */
        
        
        mountPage("/api/challengestring", ApiChallengestring.class);
        mountPage("/api/logincheck", ApiLogincheck.class);
        mountPage("/api/logout", ApiLogout.class);
        mountPage("/api/member", ApiMember.class);
        mountPage("/api/info", ApiInfo.class);
        mountPage("/api/datainitialize", ApiDatainitialize.class);
        
        mountPage("/info", InfoPage.class); // 訪問済みリンク、未訪問リンクを識別するためにも必要
        mountPage("/orgentry", OrgEntryPage.class);
        mountPage("/passwordreset", PasswordResetPage.class); // メールに記載する
        
        mountPage("/memberlist", MemberListPage.class);
        mountPage("/orgdetail", OrgDetailPage.class);
        
        mountPage("/memberdetail", MemberDetailPage.class);
        
        mountPage("/orgentrylist", OrgEntryListPage.class);
        mountPage("/orgmemberlist", OrgMemberListPage.class);
        mountPage("/infolist", InfoListPage.class);
        
        mountPage("/entrypassword", EntryPasswordPage.class); // メールに記載する
        mountPage("/orgentrydetail", OrgEntryDetailPage.class); // メールに記載する
        
        
        mountPage("/grouplist", GroupListPage.class);
        
        
        mountPage("/dashboard", DashboardPage.class);
        
        /* API：ユーザ情報(所属グループ)取得 */
        mountPage("/api/membergroup", ApiMembergroup.class);
        /* API：グループ所属メンバー情報取得 */
        mountPage("/api/groupmember", ApiGroupmember.class);
        
        
        /* マウント 定義 ここまで------------------------------------------------------------------------------------*/
        
        
        /* セッションが切れた場合に表示するページ */
        getApplicationSettings().setPageExpiredErrorPage(LoginPage.class);
        /* Internal Error時に表示するページ */
        getApplicationSettings().setInternalErrorPage(ErrorPage.class);
        /*  */
        this.getPageSettings().setVersionPagesByDefault(false);
        /* 開発モード（DEVELOPMENT）のときでも、配備モード（DEPLOYMENT）と同様にTMLからwicketタグを削除するようにする */
        getMarkupSettings().setStripWicketTags(true);
        /* エラーハンドリングなどを定義 */
        getRequestCycleListeners().add(new AppRequestCycleListener());
        
        
    }

    /* セッション管理 ------------------------------------------------------------------------------------------------*/
    @Override
    public AppSession newSession(Request request, Response response) {
        return new AppSession(request);
    }

    
    /* アプリケーションの実行モードを設定 */
    @Override
    public RuntimeConfigurationType getConfigurationType() {
        if(AppLogger.isDebug()) {
            return RuntimeConfigurationType.DEVELOPMENT; // 開発用
        } else {
            return RuntimeConfigurationType.DEPLOYMENT; // 本番用
        }
    }

}

