import apiClient from '../apiClient';
import type { PublicacionDto } from '../../models/dtos/Distribucion/PublicacionDto';
import type { CreatePublicacionDto } from '../../models/dtos/Distribucion/CreatePublicacionDto';
import type { UpdatePublicacionDto } from '../../models/dtos/Distribucion/UpdatePublicacionDto';
import type { PublicacionDiaSemanaDto } from '../../models/dtos/Distribucion/PublicacionDiaSemanaDto';
import type { UpdatePublicacionDiasSemanaRequestDto } from '../../models/dtos/Distribucion/UpdatePublicacionDiasSemanaRequestDto';
import type { PublicacionDropdownDto } from '../../models/dtos/Distribucion/PublicacionDropdownDto';

const getAllPublicaciones = async (
    nombreFilter?: string,
    idEmpresaFilter?: number,
    soloHabilitadas?: boolean
): Promise<PublicacionDto[]> => {
    const params: Record<string, string | number | boolean> = {};
    if (nombreFilter) params.nombre = nombreFilter;
    if (idEmpresaFilter) params.idEmpresa = idEmpresaFilter;
    if (soloHabilitadas !== undefined) params.soloHabilitadas = soloHabilitadas;

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

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

const createPublicacion = async (data: CreatePublicacionDto): Promise<PublicacionDto> => {
    const response = await apiClient.post<PublicacionDto>('/publicaciones', data);
    return response.data;
};

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

const deletePublicacion = async (id: number): Promise<void> => {
    await apiClient.delete(`/publicaciones/${id}`);
};

const getConfiguracionDiasPublicacion = async (idPublicacion: number): Promise<PublicacionDiaSemanaDto[]> => {
    const response = await apiClient.get<PublicacionDiaSemanaDto[]>(`/publicaciones/${idPublicacion}/dias-semana`);
    return response.data;
};

const updateConfiguracionDiasPublicacion = async (idPublicacion: number, data: UpdatePublicacionDiasSemanaRequestDto): Promise<void> => {
    await apiClient.put(`/publicaciones/${idPublicacion}/dias-semana`, data);
};

const getPublicacionesPorDiaSemana = async (diaSemana: number): Promise<PublicacionDto[]> => {
    const response = await apiClient.get<PublicacionDto[]>('/publicaciones/por-dia-semana', { params: { dia: diaSemana } });
    return response.data;
};

const getPublicacionesForDropdown = async (soloHabilitadas?: boolean): Promise<PublicacionDropdownDto[]> => {
    const response = await apiClient.get<PublicacionDropdownDto[]>('/publicaciones/dropdown', { params: { soloHabilitadas } });
    return response.data;
};

const publicacionService = {
    getAllPublicaciones,
    getPublicacionById,
    createPublicacion,
    updatePublicacion,
    deletePublicacion,
    getConfiguracionDiasPublicacion,
    updateConfiguracionDiasPublicacion,
    getPublicacionesPorDiaSemana,
    getPublicacionesForDropdown,
};

export default publicacionService;