import { defineStore } from 'pinia'
/**
 * 全局状态管理store
 * 提供全局的传值和获取值的功能
 * 任何页面都可以调用和获取其中的值
 * 添加了localStorage持久化功能，确保刷新页面后数据不会丢失
 */
export const useGlobalStore = defineStore('global', {
  // 状态定义
  state: () => {
    // 从localStorage读取持久化的数据
    const savedGlobalData = localStorage.getItem('globalStoreData')
    const initialGlobalData = savedGlobalData ? JSON.parse(savedGlobalData) : {}
    
    // 从localStorage读取特定状态的持久化数据
    const savedSpecificData = localStorage.getItem('globalStoreSpecificData')
    const initialSpecificData = savedSpecificData ? JSON.parse(savedSpecificData) : {}
    
    return {
      // 全局数据对象，存储所有需要共享的数据
      globalData: initialGlobalData,
      // 特定状态属性，从localStorage读取初始值
      username: initialSpecificData.username || null,
      Login: initialSpecificData.Login || false,
      notifications: initialSpecificData.notifications || []
    }
  },

  // 计算属性 - 用于获取和转换状态
  getters: {
    /**
     * 检查全局数据中是否存在指定的键
     * @param {string} key - 要检查的键名
     * @returns {boolean} - 如果存在返回true，否则返回false
     */
    hasValue: (state) => (key) => {
      return Object.prototype.hasOwnProperty.call(state.globalData, key)
    },

    /**
     * 获取指定键的值
     * @param {string} key - 要获取的键名
     * @returns {any} - 对应的值，如果不存在则返回undefined
     */
    getValue: (state) => (key) => {
      return state.globalData[key]
    },

    /**
     * 获取所有全局数据
     * @returns {Object} - 所有全局数据
     */
    getAllData: (state) => {
      return { ...state.globalData }
    }
  },

  // 操作方法 - 用于修改状态
  actions: {
    /**
     * 设置全局数据
     * @param {string} key - 键名
     * @param {any} value - 要存储的值
     */
    setValue(key, value) {
      this.globalData[key] = value
      // 持久化到localStorage
      this._persistData()
    },
    
    /**
     * 将数据持久化到localStorage的内部方法
     * @private
     */
    _persistData() {
      try {
        // 持久化globalData
        localStorage.setItem('globalStoreData', JSON.stringify(this.globalData))
        // 持久化特定状态属性
        localStorage.setItem('globalStoreSpecificData', JSON.stringify({
          username: this.username,
          Login: this.Login,
          notifications: this.notifications
        }))
      } catch (error) {
        console.error('Failed to persist data to localStorage:', error)
      }
    },

    /**
     * 批量设置多个键值对
     * @param {Object} data - 包含多个键值对的对象
     */
    setMultipleValues(data) {
      if (typeof data === 'object' && data !== null) {
        Object.assign(this.globalData, data)
        // 持久化到localStorage
        this._persistData()
      }
    },

    /**
     * 删除指定的全局数据
     * @param {string} key - 要删除的键名
     */
    removeValue(key) {
      if (Object.prototype.hasOwnProperty.call(this.globalData, key)) {
        delete this.globalData[key]
        // 持久化到localStorage
        this._persistData()
      }
    },

    /**
     * 清空所有全局数据
     */
    clearAll() {
      this.globalData = {}
      this.username = null
      this.Login = false
      this.notifications = []
      // 清除localStorage中的数据
      try {
        localStorage.removeItem('globalStoreData')
        localStorage.removeItem('globalStoreSpecificData')
      } catch (error) {
        console.error('Failed to clear data from localStorage:', error)
      }
    },

    /**
     * 设置用户信息
     * @param {Object} userInfo - 用户信息对象
     */
    setUsername(username) {
      this.username = username
      // 持久化到localStorage
      this._persistData()
    },

    /**
     * 设置加载状态
     * @param {boolean} status - 加载状态
     */
    setLoading(status) {
      this.loading = status
      // 持久化到localStorage
      this._persistData()
    },

    /**
     * 添加通知
     * @param {Object} notification - 通知对象
     */
    addNotification(notification) {
      this.notifications.push({
        id: Date.now(),
        ...notification
      })
      // 持久化到localStorage
      this._persistData()
    },

    /**
     * 移除通知
     * @param {number} id - 通知ID
     */
    removeNotification(id) {
      const index = this.notifications.findIndex(notification => notification.id === id)
      if (index !== -1) {
        this.notifications.splice(index, 1)
        // 持久化到localStorage
        this._persistData()
      }
    },
    
    /**
     * 设置登录状态
     * @param {boolean} status - 登录状态
     */
    setLoginStatus(status) {
      this.Login = status
      // 持久化到localStorage
      this._persistData()
    }
  }
})