import React, { lazy, memo, Suspense } from "react";
import type { KcContextBase } from "../getKcContext/KcContextBase";
import type { KcProps } from "./KcProps";
import { I18nProvider } from "../i18n";

const Login = lazy(() => import("./Login"));
const Register = lazy(() => import("./Register"));
const RegisterUserProfile = lazy(() => import("./RegisterUserProfile"));
const Info = lazy(() => import("./Info"));
const Error = lazy(() => import("./Error"));
const LoginResetPassword = lazy(() => import("./LoginResetPassword"));
const LoginVerifyEmail = lazy(() => import("./LoginVerifyEmail"));
const Terms = lazy(() => import("./Terms"));
const LoginOtp = lazy(() => import("./LoginOtp"));
const LoginUpdatePassword = lazy(() => import("./LoginUpdatePassword"));
const LoginUpdateProfile = lazy(() => import("./LoginUpdateProfile"));
const LoginIdpLinkConfirm = lazy(() => import("./LoginIdpLinkConfirm"));
const LoginPageExpired = lazy(() => import("./LoginPageExpired"));
const LoginIdpLinkEmail = lazy(() => import("./LoginIdpLinkEmail"));
const LoginConfigTotp = lazy(() => import("./LoginConfigTotp"));
const LogoutConfirm = lazy(() => import("./LogoutConfirm"));

const KcApp = memo(({ kcContext, ...props }: { kcContext: KcContextBase } & KcProps) => {
    return (
        <I18nProvider kcContext={kcContext}>
            <Suspense>
                {(() => {
                    switch (kcContext.pageId) {
                        case "login.ftl":
                            return <Login {...{ kcContext, ...props }} />;
                        case "register.ftl":
                            return <Register {...{ kcContext, ...props }} />;
                        case "register-user-profile.ftl":
                            return <RegisterUserProfile {...{ kcContext, ...props }} />;
                        case "info.ftl":
                            return <Info {...{ kcContext, ...props }} />;
                        case "error.ftl":
                            return <Error {...{ kcContext, ...props }} />;
                        case "login-reset-password.ftl":
                            return <LoginResetPassword {...{ kcContext, ...props }} />;
                        case "login-verify-email.ftl":
                            return <LoginVerifyEmail {...{ kcContext, ...props }} />;
                        case "terms.ftl":
                            return <Terms {...{ kcContext, ...props }} />;
                        case "login-otp.ftl":
                            return <LoginOtp {...{ kcContext, ...props }} />;
                        case "login-update-password.ftl":
                            return <LoginUpdatePassword {...{ kcContext, ...props }} />;
                        case "login-update-profile.ftl":
                            return <LoginUpdateProfile {...{ kcContext, ...props }} />;
                        case "login-idp-link-confirm.ftl":
                            return <LoginIdpLinkConfirm {...{ kcContext, ...props }} />;
                        case "login-idp-link-email.ftl":
                            return <LoginIdpLinkEmail {...{ kcContext, ...props }} />;
                        case "login-page-expired.ftl":
                            return <LoginPageExpired {...{ kcContext, ...props }} />;
                        case "login-config-totp.ftl":
                            return <LoginConfigTotp {...{ kcContext, ...props }} />;
                        case "logout-confirm.ftl":
                            return <LogoutConfirm {...{ kcContext, ...props }} />;
                    }
                })()}
            </Suspense>
        </I18nProvider>
    );
});

export default KcApp;