import type {
  RuntimePlugin,
  AppProvider,
  RouteWrapper,
} from "@ice/runtime/types";
import type { LoginStateConfig, LoginStateType, Auth } from "./type";
import { LoginStateProvider, useLoginState, withLoginState } from "./use";
import type { InjectProps } from "./use";
import { useState } from "react";

export { withLoginState, useLoginState };

const EXPORT_NAME = "loginStateConfig";

const runtime: RuntimePlugin = async ({
  appContext,
  useConfig,
  addProvider,
  addWrapper,
}) => {
  const { appExport, appData } = appContext;
  const exported = appExport[EXPORT_NAME];
  const authConfig: LoginStateConfig =
    (typeof exported === "function" ? await exported(appData) : exported) || {};
  const initialAuth = authConfig.initialLoginState || false;

  const AuthProviderWrapper: AppProvider = ({ children }) => {
    const [state, setState] = useState<LoginStateType>(initialAuth);

    const updateState: InjectProps["setLoginState"] = (newState = false) => {
      setState(newState);
    };
    return (
      <LoginStateProvider value={[state, updateState]}>
        {children}
      </LoginStateProvider>
    );
  };
  addProvider(AuthProviderWrapper);

  const AuthRouteWrapper: RouteWrapper = ({ children }) => {
    const [loginState] = useLoginState();
    const routeConfig = useConfig();
    const needLogin =
      routeConfig?.needLogin == null ? true : routeConfig?.needLogin;

    if (needLogin) {
      if (loginState) {
        return <>{children}</>;
      } else {
        if (authConfig.NoLoginFallback) {
          return <authConfig.NoLoginFallback routeConfig={routeConfig} />;
        } else {
          return <>当前页面需要登录</>;
        }
      }
    }
    return <>{children}</>;
  };
  addWrapper(AuthRouteWrapper);
};

export type { Auth };
export default runtime;
