import type { AppNotification, AppUser } from '../utils/types';

import { isNull } from 'lodash';

import { useACL } from '@react-devui/hooks';

import { ROLE_ACL } from '../config/acl';
import { useHttp } from './http';
import { GlobalStore } from './store';
import { TOKEN, TOKEN_REFRESH, TOKEN_REFRESH_OFFSET } from './token';

let CLEAR_TOKEN_REFRESH: (() => void) | undefined;

export function useInit() {
  const http = useHttp();
  const acl = useACL();

  return (user: AppUser) => {
    acl.set([]);
    acl.setFull(user.permission.includes(ROLE_ACL.super_admin));
    acl.add(user.permission);

    GlobalStore.set('appUser', user);

    GlobalStore.set('appMenu', (draft) => {
      draft.expands = undefined;
    });

    GlobalStore.set('appNotifications', undefined);
    http<AppNotification[]>(
      {
        url: '/notification',
        method: 'get',
      },
      { unmount: false }
    ).subscribe({
      next: (res) => {
        GlobalStore.set('appNotifications', res);
      },
    });

    CLEAR_TOKEN_REFRESH?.();
    if (TOKEN_REFRESH) {
      const refresh = () => {
        const expiration = TOKEN.expiration;
        if (!isNull(expiration) && !TOKEN.expired) {
          const tid = window.setTimeout(() => {
            const refreshTokenReq = http<string>(
              {
                url: '/auth/refresh',
                method: 'post',
              },
              { unmount: false }
            );
            refreshTokenReq.subscribe({
              next: (res) => {
                TOKEN.set(res);

                refresh();
              },
            });
            CLEAR_TOKEN_REFRESH = () => {
              refreshTokenReq.abort();
            };
          }, expiration - Date.now() - TOKEN_REFRESH_OFFSET);
          CLEAR_TOKEN_REFRESH = () => {
            clearTimeout(tid);
          };
        }
      };
      refresh();
    }
  };
}