import { authApi } from '@/api/auth'
import { ElMessage } from 'element-plus'

const state = {
  // 登录状态
  isLoggedIn: false,
  // 用户信息
  userInfo: null,
  // Token信息
  token: null,
  // 登录加载状态
  loginLoading: false
}

const getters = {
  // 是否已登录
  isAuthenticated: state => state.isLoggedIn,
  // 获取用户信息
  userInfo: state => state.userInfo,
  // 获取用户名
  username: state => state.userInfo?.user?.username || '',
  // 获取用户头像
  avatar: state => state.userInfo?.user?.avatar || '',
  // 获取用户组信息
  userGroup: state => state.userInfo?.user?.group || null,
  // 登录加载状态
  loginLoading: state => state.loginLoading
}

const mutations = {
  // 设置登录状态
  SET_LOGIN_STATUS(state, status) {
    state.isLoggedIn = status
  },
  
  // 设置用户信息
  SET_USER_INFO(state, userInfo) {
    state.userInfo = userInfo
  },
  
  // 设置Token
  SET_TOKEN(state, token) {
    state.token = token
  },
  
  // 设置登录加载状态
  SET_LOGIN_LOADING(state, loading) {
    state.loginLoading = loading
  },
  
  // 清除用户数据
  CLEAR_USER_DATA(state) {
    state.isLoggedIn = false
    state.userInfo = null
    state.token = null
    state.loginLoading = false
  }
}

const actions = {
  // 用户登录
  async login({ commit }, loginData) {
    try {
      commit('SET_LOGIN_LOADING', true)
      
      const response = await authApi.login(loginData)
      
      if (response) {
        // 保存Token
        const tokenInfo = response.token
        if (tokenInfo && tokenInfo.tokenValue) {
          localStorage.setItem('token', tokenInfo.tokenValue)
          localStorage.setItem('tokenInfo', JSON.stringify(tokenInfo))
          commit('SET_TOKEN', tokenInfo)
        }
        
        // 保存用户信息
        localStorage.setItem('userInfo', JSON.stringify(response))
        localStorage.setItem('isLoggedIn', 'true')
        
        commit('SET_USER_INFO', response)
        commit('SET_LOGIN_STATUS', true)
        
        ElMessage.success('登录成功！')
        return response
      }
    } catch (error) {
      console.error('登录失败:', error)
      throw error
    } finally {
      commit('SET_LOGIN_LOADING', false)
    }
  },
  
  // 用户注册
  async register({ commit }, registerData) {
    try {
      commit('SET_LOGIN_LOADING', true)
      
      const response = await authApi.register(registerData)
      
      if (response) {
        // 注册成功后自动登录
        const tokenInfo = response.token
        if (tokenInfo && tokenInfo.tokenValue) {
          localStorage.setItem('token', tokenInfo.tokenValue)
          localStorage.setItem('tokenInfo', JSON.stringify(tokenInfo))
          commit('SET_TOKEN', tokenInfo)
        }
        
        localStorage.setItem('userInfo', JSON.stringify(response))
        localStorage.setItem('isLoggedIn', 'true')
        
        commit('SET_USER_INFO', response)
        commit('SET_LOGIN_STATUS', true)
        
        ElMessage.success('注册成功！')
        return response
      }
    } catch (error) {
      console.error('注册失败:', error)
      throw error
    } finally {
      commit('SET_LOGIN_LOADING', false)
    }
  },
  
  // 用户登出
  async logout({ commit }) {
    try {
      await authApi.logout()
    } catch (error) {
      console.error('登出请求失败:', error)
      // 即使登出请求失败，也要清除本地数据
    } finally {
      // 清除本地存储
      localStorage.removeItem('token')
      localStorage.removeItem('tokenInfo')
      localStorage.removeItem('userInfo')
      localStorage.removeItem('isLoggedIn')
      
      // 清除状态
      commit('CLEAR_USER_DATA')
      
      ElMessage.success('已退出登录')
    }
  },
  
  // 检查登录状态
  async checkLoginStatus({ commit }) {
    try {
      const response = await authApi.getStatus()
      
      if (response && response.isLoggedIn && response.user) {
        // 更新用户信息
        localStorage.setItem('userInfo', JSON.stringify(response.user))
        localStorage.setItem('isLoggedIn', 'true')
        
        commit('SET_USER_INFO', response.user)
        commit('SET_LOGIN_STATUS', true)
        
        return true
      } else {
        // 登录状态无效，清除本地数据
        commit('CLEAR_USER_DATA')
        localStorage.removeItem('token')
        localStorage.removeItem('tokenInfo')
        localStorage.removeItem('userInfo')
        localStorage.removeItem('isLoggedIn')
        
        return false
      }
    } catch (error) {
      console.error('检查登录状态失败:', error)
      commit('CLEAR_USER_DATA')
      return false
    }
  },
  
  // 从本地存储恢复登录状态
  restoreLoginState({ commit }) {
    const isLoggedIn = localStorage.getItem('isLoggedIn') === 'true'
    const userInfo = localStorage.getItem('userInfo')
    const tokenInfo = localStorage.getItem('tokenInfo')
    
    if (isLoggedIn && userInfo) {
      try {
        const parsedUserInfo = JSON.parse(userInfo)
        const parsedTokenInfo = tokenInfo ? JSON.parse(tokenInfo) : null
        
        commit('SET_USER_INFO', parsedUserInfo)
        commit('SET_TOKEN', parsedTokenInfo)
        commit('SET_LOGIN_STATUS', true)
        
        console.log('✅ 已从本地存储恢复登录状态')
      } catch (error) {
        console.error('❌ 恢复登录状态失败:', error)
        commit('CLEAR_USER_DATA')
      }
    }
  }
}

export default {
  namespaced: true,
  state,
  getters,
  mutations,
  actions
}