import apiClient from '../apiClient';
import type { UsuarioHistorialDto } from '../../models/dtos/Usuarios/Auditoria/UsuarioHistorialDto';
import type { UsuarioDto } from '../../models/dtos/Usuarios/UsuarioDto';
import type { CreateUsuarioRequestDto } from '../../models/dtos/Usuarios/CreateUsuarioRequestDto';
import type { UpdateUsuarioRequestDto } from '../../models/dtos/Usuarios/UpdateUsuarioRequestDto';
import type { SetPasswordRequestDto } from '../../models/dtos/Usuarios/SetPasswordRequestDto';

interface HistorialParams {
    fechaDesde?: string | null; // "yyyy-MM-dd"
    fechaHasta?: string | null; // "yyyy-MM-dd"
    idUsuarioModifico?: number | null;
    tipoModificacion?: string | null;
}

const getAllUsuarios = async (userFilter?: string, nombreFilter?: string): Promise<UsuarioDto[]> => {
    const params: Record<string, string> = {};
    if (userFilter) params.user = userFilter;
    if (nombreFilter) params.nombre = nombreFilter;

    const response = await apiClient.get<UsuarioDto[]>('/usuarios', { params });
    return response.data;
};

const getUsuarioById = async (id: number): Promise<UsuarioDto> => {
    const response = await apiClient.get<UsuarioDto>(`/usuarios/${id}`);
    return response.data;
};

const createUsuario = async (data: CreateUsuarioRequestDto): Promise<UsuarioDto> => {
    const response = await apiClient.post<UsuarioDto>('/usuarios', data);
    return response.data;
};

const updateUsuario = async (id: number, data: UpdateUsuarioRequestDto): Promise<void> => {
    await apiClient.put(`/usuarios/${id}`, data);
};

const setPassword = async (id: number, data: SetPasswordRequestDto): Promise<void> => {
    await apiClient.post(`/usuarios/${id}/set-password`, data);
};

const toggleHabilitado = async (id: number, habilitar: boolean): Promise<void> => {
    // El backend espera un booleano simple en el cuerpo para este endpoint específico.
    await apiClient.post(`/usuarios/${id}/toggle-habilitado`, habilitar, {
        headers: { 'Content-Type': 'application/json' } // Asegurarse de que se envíe como JSON
    });
};

const getHistorialDeUsuario = async (idUsuarioAfectado: number, params?: Omit<HistorialParams, 'idUsuarioModifico' | 'tipoModificacion'>): Promise<UsuarioHistorialDto[]> => {
    const queryParams: Record<string, string> = {};
    if (params?.fechaDesde) queryParams.fechaDesde = params.fechaDesde;
    if (params?.fechaHasta) queryParams.fechaHasta = params.fechaHasta;
    
    const response = await apiClient.get<UsuarioHistorialDto[]>(`/usuarios/${idUsuarioAfectado}/historial`, { params: queryParams });
    return response.data;
};

const getTodoElHistorialDeUsuarios = async (params?: HistorialParams): Promise<UsuarioHistorialDto[]> => {
    const queryParams: Record<string, string | number> = {};
    if (params?.fechaDesde) queryParams.fechaDesde = params.fechaDesde;
    if (params?.fechaHasta) queryParams.fechaHasta = params.fechaHasta;
    if (params?.idUsuarioModifico) queryParams.idUsuarioModifico = params.idUsuarioModifico;
    if (params?.tipoModificacion) queryParams.tipoModificacion = params.tipoModificacion;

    const response = await apiClient.get<UsuarioHistorialDto[]>('/usuarios/historial', { params: queryParams });
    return response.data;
};

const usuarioService = {
    getAllUsuarios,
    getUsuarioById,
    createUsuario,
    updateUsuario,
    setPassword,
    toggleHabilitado,
    getHistorialDeUsuario,
    getTodoElHistorialDeUsuarios,
};

export default usuarioService;