import type { ErrorLogInfo } from '/#/store';



import { defineStore } from 'pinia';

import { store } from '/@/store';



import { formatToDateTime } from '/@/utils/dateUtil';

import projectSetting from '/@/settings/projectSetting';



import { ErrorTypeEnum } from '/@/enums/exceptionEnum';



export interface ErrorLogState {

  errorLogInfoList: Nullable<ErrorLogInfo[]>;

  errorLogListCount: number;

}



export const useErrorLogStore = defineStore({

  id: 'app-error-log',

  state: (): ErrorLogState => ({

    errorLogInfoList: null,

    errorLogListCount: 0,

  }),

  getters: {

    getErrorLogInfoList(): ErrorLogInfo[] {

      return this.errorLogInfoList || [];

    },

    getErrorLogListCount(): number {

      return this.errorLogListCount;

    },

  },

  actions: {

    addErrorLogInfo(info: ErrorLogInfo) {

      const item = {

        ...info,

        time: formatToDateTime(new Date()),

      };

      this.errorLogInfoList = [item, ...(this.errorLogInfoList || [])];

      this.errorLogListCount += 1;

    },



    setErrorLogListCount(count: number): void {

      this.errorLogListCount = count;

    },



    /**

     * Triggered after ajax request error

     * @param error

     * @returns

     */

    addAjaxErrorInfo(error) {

      const { useErrorHandle } = projectSetting;

      if (!useErrorHandle) {

        return;

      }

      const errInfo: Partial<ErrorLogInfo> = {

        message: error.message,

        type: ErrorTypeEnum.AJAX,

      };

      if (error.response) {

        const { config: { url = '', data: params = '', method = 'get', headers = {} } = {}, data = {} } = error.response;

        errInfo.url = url;

        errInfo.name = 'Ajax Error!';

        errInfo.file = '-';

        errInfo.stack = JSON.stringify(data);

        errInfo.detail = JSON.stringify({ params, method, headers });

      }

      this.addErrorLogInfo(errInfo as ErrorLogInfo);

    },

  },

});



// Need to be used outside the setup

export function useErrorLogStoreWithOut() {

  return useErrorLogStore(store);

}