import type { LocaleSetting, LocaleType } from '/#/config'

import { defineStore } from 'pinia'
import { store } from '/@/store'

import { LOCALE_KEY } from '/@/enums/cacheEnum'
import { createLocalStorage } from '/@/utils/cache'
import { localeSetting } from '/@/settings/localeSetting'

const ls = createLocalStorage()

const lsLocaleSetting = (ls.get(LOCALE_KEY) || localeSetting) as LocaleSetting

interface LocaleState {
    localInfo: LocaleSetting
}

export const useLocaleStore = defineStore({
    id: 'app-locale',
    state: (): LocaleState => ({
        localInfo: lsLocaleSetting,
    }),
    getters: {
        getShowPicker(): boolean {
            return !!this.localInfo?.showPicker
        },
        getLocale(): LocaleType {
            return this.localInfo?.locale ?? 'zh_CN'
        },
    },
    actions: {
        /**
         * Set up multilingual information and cache
         * @param info multilingual info
         */
        setLocaleInfo(info: Partial<LocaleSetting>) {
            this.localInfo = { ...this.localInfo, ...info }
            ls.set(LOCALE_KEY, this.localInfo)
        },
        /**
         * Initialize multilingual information and load the existing configuration from the local cache
         */
        initLocale() {
            this.setLocaleInfo({
                ...localeSetting,
                ...this.localInfo,
            })
        },
    },
})

// Need to be used outside the setup
export function useLocaleStoreWithOut() {
    return useLocaleStore(store)
}
