import { defineStore } from 'pinia';
import type { UserInfo, UserState } from './types';
import { localStorage } from '@/utils/storage';
import { TOKEN_KEY, USER_INFO_KEY, getToken, hasToken } from '@/utils/auth';

// 定义用户模块 Store
export const useUserStore = defineStore('user', {
  // 状态
  state: (): UserState => ({
    userInfo: null,
    token: null,
    isLoggedIn: false,
    permissions: [],
    roles: []
  }),

  // Getters
  getters: {
    // 获取用户信息
    getUserInfo(): UserInfo | null {
      return this.userInfo;
    },
    // 判断用户是否登录 - 根据 token 判断
    getIsLoggedIn(): boolean {
      // 如果内存中没有 token，则检查本地存储
      if (!this.token) {
        // 使用 auth 中的 hasToken 函数检查是否存在 token
        if (hasToken()) {
          // 如果存在，则获取 token 并更新状态
          this.token = getToken();
          return true;
        }
        return false;
      }
      return true;
    },
    // 获取用户权限
    getPermissions(): string[] {
      return this.permissions;
    },
    // 获取用户角色
    getRoles(): string[] {
      return this.roles;
    }
  },

  // Actions
  actions: {
    // 设置用户信息
    setUserInfo(userInfo: UserInfo | null) {
      this.userInfo = userInfo;
      this.isLoggedIn = !!userInfo;
      
      // 保存到本地存储
      if (userInfo) {
        localStorage.set(USER_INFO_KEY, userInfo);
      } else {
        localStorage.remove(USER_INFO_KEY);
      }
    },
    // 设置 Token
    setToken(token: string | null) {
      this.token = token;
      
      // 保存到本地存储
      if (token) {
        localStorage.set(TOKEN_KEY, token);
      } else {
        localStorage.remove(TOKEN_KEY);
      }
    },
    // 设置权限
    setPermissions(permissions: string[]) {
      this.permissions = permissions;
      
      // 保存到本地存储 - 更新用户信息对象
      const userInfo = this.userInfo ? { ...this.userInfo, permissions } : { permissions };
      this.setUserInfo(userInfo as UserInfo);
    },
    // 设置角色
    setRoles(roles: string[]) {
      this.roles = roles;
      
      // 保存到本地存储 - 更新用户信息对象
      const userInfo = this.userInfo ? { ...this.userInfo, roles } : { roles };
      this.setUserInfo(userInfo as UserInfo);
    },
    // 登录
    async login(username: string, password: string) {
      try {
        // 这里应该调用实际的登录 API
        // const { data } = await api.login({ username, password });
        
        // 模拟登录成功
        const mockUserInfo: UserInfo = {
          id: '1',
          username,
          avatar: 'https://example.com/avatar.png'
        };
        const mockToken = 'mock-token-' + Date.now();
        
        // 保存用户信息和 Token
        this.setUserInfo(mockUserInfo);
        this.setToken(mockToken);
        this.setPermissions(['read', 'write']);
        this.setRoles(['user']);
        
        return { success: true };
      } catch (error) {
        return { success: false, error };
      }
    },
    // 登出
    logout() {
      this.setUserInfo(null);
      this.setToken(null);
      this.setPermissions([]);
      this.setRoles([]);
    },
    // 从本地存储恢复用户状态
    restoreFromStorage() {
      try {
        // 恢复 token
        const token = getToken();
        if (token) {
          this.token = token;
        }
        
        // 恢复用户信息
        const userInfo = localStorage.get<UserInfo>(USER_INFO_KEY);
        if (userInfo) {
          this.userInfo = userInfo;
          this.isLoggedIn = true;
        }
        
        return {
          token: this.token,
          userInfo: this.userInfo,
          isLoggedIn: this.isLoggedIn
        };
      } catch (error) {
        console.error('Failed to restore user state from storage', error);
        return { error };
      }
    }
  }
});

// 在创建 store 时自动从本地存储恢复状态
const userStore = useUserStore();
userStore.restoreFromStorage();

// 导出默认模块
export default {
  store: useUserStore
}; 