/**
 * 用户状态管理模块
 * 作者: 阿瑞
 * 功能: 管理用户登录状态、权限和个人信息
 * 版本: 1.3
 */

import { create } from 'zustand';
import { persist, createJSONStorage } from 'zustand/middleware';
import { 
  WorkspaceStatus, 
  IUserDetail} from '@/models/system/types';

/**
 * 前端用户状态类型
 * 针对UI需求调整的用户数据结构
 */
export interface IFrontendUser extends Omit<IUserDetail, 'workspace_id' | 'role_name' | 'role_type' | 'is_custom_role' | 'last_login_at'> {
  roleType: string;         // 角色类型 (从role_type映射)
  roleName: string;         // 角色显示名称 (从role_name映射)
  isCustomRole: boolean;    // 是否为自定义角色 (从is_custom_role映射)
  lastLoginAt?: string;     // 最后登录时间 (转为字符串格式)
  workspace: {              // 工作空间信息
    id: number;
    name: string;
    status: WorkspaceStatus;
  };
  role?: string;            // 兼容旧代码的角色字段
  isAdmin?: boolean;        // 是否为管理员
  teamId?: number;          // 当前选中的团队ID
}

/**
 * 用户存储状态类型定义
 */
type UserStore = {
  userInfo: Partial<IFrontendUser>;
  accessToken: string;
  isAuthenticated: boolean;
  actions: {
    setUserInfo: (userInfo: IFrontendUser) => void;
    setUserToken: (accessToken: string) => void;
    clearUserInfoAndToken: () => void;
    fetchAndSetUserInfo: () => Promise<void>;
    logout: () => Promise<void>;
  };
};

/**
 * 初始状态
 */
const initialState = {
  userInfo: {},
  accessToken: '',
  isAuthenticated: false,
};

/**
 * 创建用户状态管理存储
 * 使用zustand实现响应式状态管理
 */
export const useUserStore = create<UserStore>()(
  persist(
    (set, get) => ({
      ...initialState,
      actions: {
        /**
         * 设置用户信息
         * @param userInfo 用户信息对象
         */
        setUserInfo: (userInfo: IFrontendUser) => {
          set({
            userInfo,
            isAuthenticated: true,
          });
        },
        
        /**
         * 设置访问令牌
         * @param accessToken JWT访问令牌
         */
        setUserToken: (accessToken: string) => {
          set({
            accessToken,
            isAuthenticated: !!accessToken, // 确保令牌存在时设置为已认证
          });
        },
        
        /**
         * 清除用户信息和令牌
         * 用于用户注销或令牌失效
         */
        clearUserInfoAndToken: () => {
          set(initialState);
        },
        
        /**
         * 获取并设置用户信息
         * 从API获取最新的用户信息
         */
        fetchAndSetUserInfo: async () => {
          try {
            const { accessToken } = get();
            
            if (!accessToken) {
              console.error('获取用户信息失败: 未找到访问令牌');
              return;
            }
            
            const response = await fetch('/api/auth/me', {
              headers: {
                'Authorization': `Bearer ${accessToken}`
              }
            });
            
            if (!response.ok) {
              throw new Error('获取用户信息请求失败');
            }
            
            const data = await response.json();
            
            // 系统用户模型转换为前端用户模型
            const frontendUser: IFrontendUser = {
              ...data.user,
              roleType: data.user.role_type,
              roleName: data.user.role_name,
              isCustomRole: data.user.is_custom_role,
              lastLoginAt: data.user.last_login_at ? new Date(data.user.last_login_at).toISOString() : undefined,
              workspace: {
                id: data.user.workspace_id,
                name: data.user.workspace_name || '',
                status: data.user.workspace_status || WorkspaceStatus.ACTIVE
              }
            };
            
            get().actions.setUserInfo(frontendUser);
            
          } catch (error) {
            console.error('获取用户信息失败:', error);
            // 处理认证错误
            if (error instanceof Error && 
               (error.message.includes('401') || error.message.includes('授权'))) {
              get().actions.clearUserInfoAndToken();
            }
          }
        },
        
        /**
         * 用户注销
         * 调用注销API并清除本地存储
         */
        logout: async () => {
          try {
            const { accessToken } = get();
            
            if (accessToken) {
              // 调用注销API
              await fetch('/api/auth/logout', {
                method: 'POST',
                headers: {
                  'Authorization': `Bearer ${accessToken}`
                }
              });
            }
          } catch (error) {
            console.error('注销失败:', error);
          } finally {
            // 无论API调用成功与否，都清除本地状态
            get().actions.clearUserInfoAndToken();
          }
        }
      }
    }),
    {
      name: 'saas-user-storage', // 存储的键名
      storage: createJSONStorage(() => localStorage), // 使用localStorage
      partialize: (state) => ({ 
        userInfo: state.userInfo, 
        accessToken: state.accessToken, 
        isAuthenticated: state.isAuthenticated 
      }), // 仅持久化这些字段
    }
  )
);

/**
 * 导出便捷访问器
 * 方便在组件中访问特定状态
 */
export const useUserActions = () => useUserStore((state) => state.actions);
export const useUserInfo = () => useUserStore((state) => state.userInfo);
export const useIsAuthenticated = () => useUserStore((state) => state.isAuthenticated);
export const useAccessToken = () => useUserStore((state) => state.accessToken);
