// src/client/entities/user.ts
// User entity - Pinia store and types

import { defineStore } from 'pinia';
import { authRepository, type UserResponse, type LoginRequest } from '../shared/api/repositories/AuthRepository';
import { usePermissionsStore } from './permissions';
import { useTaskStore } from './task';

// Типы для совместимости с существующим кодом
export interface User {
  id: string;
  username: string;
  fullName?: string | null;
  email: string | null;
  role: string;
  position?: string | null;
  employeeId?: string | null;
}

export interface LoginCredentials {
  username: string;
  password: string;
}

export interface LoginResponse {
  user: User;
}

/**
 * Преобразует UserResponse в User для совместимости
 */
function userResponseToUser(response: UserResponse): User {
  return {
    id: response.id,
    username: response.username,
    fullName: response.fullName,
    email: response.email,
    role: response.role,
    position: response.position,
    employeeId: response.employeeId,
  };
}

export const useUserStore = defineStore('user', {
  state: () => ({
    user: null as User | null,
    isAuthenticated: false as boolean,
  }),

  getters: {
    hasUser: (state) => state.user !== null,
    role: (state) => state.user?.role || null,
    isGod: (state) => state.user?.role === 'GOD',
  },

  actions: {
    async login(credentials: LoginCredentials): Promise<void> {
      try {
        // Используем AuthRepository для логина
        const loginRequest: LoginRequest = {
          username: credentials.username,
          password: credentials.password,
        };

        const response = await authRepository.login(loginRequest);

        if (response.user) {
          this.user = userResponseToUser(response.user);
          this.isAuthenticated = true;
        } else {
          throw new Error('Login failed');
        }
      } catch (error: any) {
        this.logout();
        throw error;
      }
    },

    async guestLogin(): Promise<void> {
      try {
        const response = await authRepository.guestLogin();

        if (response.user) {
          this.user = userResponseToUser(response.user);
          this.isAuthenticated = true;
        } else {
          throw new Error('Guest login failed');
        }
      } catch (error: any) {
        this.logout();
        throw error;
      }
    },

    async logout(): Promise<void> {
      try {
        // Используем AuthRepository для логаута
        await authRepository.logout();
      } catch (error) {
        // Даже если логаут не удался, очищаем локальное состояние
        console.error('Logout error:', error);
      } finally {
        this.user = null;
        this.isAuthenticated = false;

        // Полный сброс прав текущего пользователя
        const permissionsStore = usePermissionsStore();
        permissionsStore.$reset();
        
        const taskStore = useTaskStore();
        taskStore.clearTasks();
      }
    },

    checkAuth(): boolean {
      this.isAuthenticated = !!this.user;
      return this.isAuthenticated;
    },

    setUser(user: User) {
      this.user = user;
    },

    clearUser() {
      // Сбрасываем состояние пользователя
      this.user = null;
      this.isAuthenticated = false;

      // Очищаем localStorage вручную для полной очистки
      // Note: pinia-plugin-persistedstate хранит данные с ключом 'user'
      if (typeof window !== 'undefined' && window.localStorage) {
        window.localStorage.removeItem('user');
        window.localStorage.removeItem('permissions');
      }
    },
  },

  persist: true,
});
