import { defineStore } from 'pinia'
import { ref, computed } from 'vue'
import { AuthApi, type User as ApiUser } from '@/api'

// 扩展API用户类型以保持兼容性
export interface User extends ApiUser {}

export const useUserStore = defineStore('user', () => {
  // 状态
  const user = ref<User | null>(null)
  const token = ref<string | null>(localStorage.getItem('token'))
  const isLoading = ref(false)

  // 计算属性
  const isLoggedIn = computed(() => !!user.value && !!token.value)
  const isStudent = computed(() => user.value?.role === 'student')
  const isTeacher = computed(() => user.value?.role === 'teacher')
  const isAdmin = computed(() => user.value?.role === 'admin')

  // 方法 - 简化版本，主要用于状态管理
  const login = async (_credentials: { email: string; password: string }) => {
    // 这个方法现在主要用于兼容性，实际登录逻辑在组件中处理
    return { success: true, message: '请使用登录模态框进行登录' }
  }

  const register = async (_userData: any) => {
    // 这个方法现在主要用于兼容性，实际注册逻辑在组件中处理
    return { success: true, message: '请使用注册模态框进行注册' }
  }

  const logout = async () => {
    try {
      // 调用登出API
      await AuthApi.logout()
    } catch (error) {
      console.error('登出API调用失败:', error)
    } finally {
      // 无论API调用是否成功，都清除本地数据
      user.value = null
      token.value = null
      localStorage.removeItem('token')
      localStorage.removeItem('refreshToken')
      localStorage.removeItem('user')
      localStorage.removeItem('rememberMe')
    }
  }

  // 获取当前用户信息
  const getCurrentUser = async () => {
    if (!token.value) {
      return { success: false, message: '未登录' }
    }

    // 如果已经有用户信息，直接返回成功
    if (user.value) {
      return { success: true, message: '用户信息已存在' }
    }

    // 尝试从localStorage恢复用户信息
    const savedUser = localStorage.getItem('user')
    if (savedUser) {
      try {
        user.value = JSON.parse(savedUser)
        return { success: true, message: '用户信息已恢复' }
      } catch (error) {
        console.error('解析用户信息失败:', error)
      }
    }

    // 暂时注释掉API调用，因为后端可能没有这个接口
    // isLoading.value = true
    // try {
    //   const response = await AuthApi.getCurrentUser()

    //   if (response.code === 200 || response.code === 0) {
    //     user.value = response.data
    //     localStorage.setItem('user', JSON.stringify(response.data))
    //     return { success: true, message: '获取用户信息成功' }
    //   } else {
    //     return { success: false, message: response.message || '获取用户信息失败' }
    //   }
    // } catch (error: any) {
    //   console.error('获取用户信息失败:', error)

    //   // 如果是401错误，说明token已过期，自动登出
    //   if (error.response?.status === 401) {
    //     await logout()
    //     return { success: false, message: '登录已过期，请重新登录' }
    //   }

    //   return { success: false, message: '获取用户信息失败' }
    // } finally {
    //   isLoading.value = false
    // }

    return { success: false, message: '无法获取用户信息' }
  }

  const updateProfile = async (profileData: any) => {
    isLoading.value = true
    try {
      const response = await AuthApi.updateProfile(profileData)

      if (response.code === 200) {
        user.value = response.data
        localStorage.setItem('user', JSON.stringify(response.data))
        return { success: true, message: '更新成功' }
      } else {
        return { success: false, message: response.message || '更新失败' }
      }
    } catch (error: any) {
      console.error('更新用户资料失败:', error)

      let message = '更新失败'
      if (error.response?.data?.message) {
        message = error.response.data.message
      }

      return { success: false, message }
    } finally {
      isLoading.value = false
    }
  }

  const initializeAuth = async () => {
    const savedUser = localStorage.getItem('user')
    const savedToken = localStorage.getItem('token')

    if (savedUser && savedToken) {
      try {
        user.value = JSON.parse(savedUser)
        token.value = savedToken

        // 验证token是否仍然有效
        await getCurrentUser()
      } catch (error) {
        console.error('Failed to parse saved user data or token expired:', error)
        await logout()
      }
    }
  }



  return {
    // 状态
    user,
    token,
    isLoading,
    // 计算属性
    isLoggedIn,
    isStudent,
    isTeacher,
    isAdmin,
    // 方法
    login,
    register,
    logout,
    getCurrentUser,
    updateProfile,
    initializeAuth
  }
})
