import { defineAppConfig, history, defineDataLoader } from "ice";
import { defineAuthConfig } from "@ice/plugin-auth/types";
import { defineStoreConfig } from "@ice/plugin-store/types";
import { defineRequestConfig } from "@ice/plugin-request/types";
import { Button, Result } from "antd";
import { proxyApi } from "./apis";
import { defineLoginStateConfig } from "../plugins/plugin-login-state/type";
import "./utils/validator";

// App config, see https://v3.ice.work/docs/guide/basic/app
export default defineAppConfig(() => ({
  app: {
    rootId: "chuntianxiaozhu",
  },
  router: {
    type: "hash",
  },
}));

export const authConfig = defineAuthConfig(async (appData) => {
  const { userInfo } = appData;

  if (!userInfo) {
    history?.push(`/login?redirect=${window.location.pathname}`);
  }

  const auth = {};

  userInfo?.roles?.forEach((authName) => {
    auth[authName] = true;
  });

  return {
    initialAuth: auth,
    NoAuthFallback: () => {
      // 没有权限直接到入驻界面
      history?.replace("/settlein");
      return null;
    },
  };
});

export const loginStateConfig = defineLoginStateConfig(async (appData) => {
  const { userInfo } = appData;

  if (!userInfo) {
    history?.push(`/login?redirect=${window.location.pathname}`);
  }
  return {
    initialLoginState: !!userInfo,
    NoLoginFallback: () => {
      return (
        <Result
          status="403"
          title="403"
          subTitle="您还未登录,无法访问当前页面"
          extra={
            <Button
              type="primary"
              onClick={() => {
                history?.replace(`/login?redirect=${window.location.pathname}`);
              }}
            >
              去登录
            </Button>
          }
        />
      );
    },
  };
});

export const storeConfig = defineStoreConfig(async (appData) => {
  const { userInfo = {} } = appData;
  return {
    initialStates: {
      user: {
        currentUser: userInfo,
      },
    },
  };
});

export const request = defineRequestConfig(() => ({
  baseURL: "/api",
}));

export const dataLoader = defineDataLoader(async () => {
  const userInfo = await getUserInfo();
  return {
    userInfo,
  };
});

async function getUserInfo() {
  try {
    const userInfo = await proxyApi.auth.queryUserInfo();
    userInfo.roles = userInfo.roles?.split(",") || [];
    return userInfo;
  } catch (error) {
    return;
  }
}
