import { defineStore } from 'pinia'
import { useVisitedRowState } from './visitedRow'
import { useNotificationMessage } from './notificationMessage'
import dayjs from 'dayjs'

interface UserInfo {
  uname: string
  first_name: string
  last_name: string
  user_type: string
  email: string
  expire_day: number
  date_format: string
  numbers_format: string
  PASSWORD_CHANGE_CYCLE: number // 密码修改周期（多少天需要改一次）
  last_pwd_change: string // 上次密码修改时间
}
interface UserState {
  userInfo: UserInfo
  isFirstLogin: boolean
}

/**
 * 根据用户地区判断日期格式
 * @returns {string} - 返回日期格式
 */
const getDateFormat = () => {
  const userLanguage = navigator.language || 'en-US' // 获取浏览器的语言设置
  // 判断用户地区
  if (userLanguage === 'en-US') {
    return 'MM/DD/YYYY' // 美国使用 MM/DD/YYYY 格式
  } else if (
    userLanguage.startsWith('de') ||
    userLanguage.startsWith('fr') ||
    userLanguage.startsWith('it') ||
    userLanguage.startsWith('es') ||
    userLanguage.startsWith('pl') ||
    userLanguage.startsWith('nl') ||
    userLanguage.startsWith('pt') ||
    userLanguage.startsWith('se')
  ) {
    return 'DD/MM/YYYY' // 其他欧洲国家（例：德语、法语、西班牙语等）使用 DD/MM/YYYY 格式
  } else if (['zh-CN', 'ja-JP', 'ko-KR'].includes(userLanguage)) {
    return 'YYYY-MM-DD' // 东亚国家（如简体中文、日语、韩语）使用 YYYY-MM-DD 格式
  } else {
    return 'DD/MM/YYYY' // 其他地区默认 DD/MM/YYYY 格式
  }
}

export const useUserStore = defineStore('user', {
  state: (): UserState => ({
    userInfo: JSON.parse(localStorage.getItem('userInfo') || '{}'),
    isFirstLogin: localStorage.getItem('isFirstLogin')
      ? JSON.parse(localStorage.getItem('isFirstLogin'))
      : false
  }),
  getters: {
    userName(state) {
      if (state.userInfo.first_name && state.userInfo.last_name) {
        return `${state.userInfo.first_name} ${state.userInfo.last_name}`
      } else {
        return state.userInfo.uname || ''
      }
    },
    dateFormat(state) {
      return state.userInfo.date_format || getDateFormat()
    },
    expireDay(state) {
      const userInfo = state.userInfo
      return userInfo.PASSWORD_CHANGE_CYCLE - dayjs().diff(dayjs(userInfo.last_pwd_change), 'day')
    },
    isLogin(state) {
      return !(!state.userInfo?.uname || (state.userInfo?.uname && state.isFirstLogin === true))
    }
  },
  actions: {
    setUserInfo(userInfo: any, isFirstLogin?: boolean) {
      this.userInfo = userInfo
      localStorage.setItem('userInfo', JSON.stringify(userInfo))

      if (isFirstLogin !== undefined) {
        localStorage.setItem('isFirstLogin', JSON.stringify(isFirstLogin))
        this.isFirstLogin = isFirstLogin
      }
    },

    async logout(isNeedLogout: boolean = true) {
      if (isNeedLogout) {
        await $api.logout().then(() => {})
      }
      localStorage.removeItem('userInfo')
      this.userInfo = {}
      if (localStorage.getItem('isFirstLogin')) {
        localStorage.removeItem('isFirstLogin')
      }
      this.isFirstLogin = false
      useVisitedRowState().clearVisitedRow()
      useNotificationMessage().clearData()
    }
  }
})
