import apiClient from '../apiClient';
import type { SuscripcionDto } from '../../models/dtos/Suscripciones/SuscripcionDto';
import type { CreateSuscripcionDto } from '../../models/dtos/Suscripciones/CreateSuscripcionDto';
import type { UpdateSuscripcionDto } from '../../models/dtos/Suscripciones/UpdateSuscripcionDto';
import type { PromocionDto } from '../../models/dtos/Suscripciones/PromocionDto';
import type { PromocionAsignadaDto } from '../../models/dtos/Suscripciones/PromocionAsignadaDto';
import type { AsignarPromocionDto } from '../../models/dtos/Suscripciones/AsignarPromocionDto';

const API_URL_BASE = '/suscripciones';
const API_URL_SUSCRIPTORES = '/suscriptores';

const getSuscripcionesPorSuscriptor = async (idSuscriptor: number): Promise<SuscripcionDto[]> => {
    // La URL correcta es /suscriptores/{id}/suscripciones, no /suscripciones/suscriptor/...
    const response = await apiClient.get<SuscripcionDto[]>(`${API_URL_SUSCRIPTORES}/${idSuscriptor}/suscripciones`);
    return response.data;
};

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

const createSuscripcion = async (data: CreateSuscripcionDto): Promise<SuscripcionDto> => {
    const response = await apiClient.post<SuscripcionDto>(API_URL_BASE, data);
    return response.data;
};

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

const getPromocionesAsignadas = async (idSuscripcion: number): Promise<PromocionAsignadaDto[]> => {
    const response = await apiClient.get<PromocionAsignadaDto[]>(`${API_URL_BASE}/${idSuscripcion}/promociones`);
    return response.data;
};

const getPromocionesDisponibles = async (idSuscripcion: number): Promise<PromocionDto[]> => {
    const response = await apiClient.get<PromocionDto[]>(`${API_URL_BASE}/${idSuscripcion}/promociones-disponibles`);
    return response.data;
};

const asignarPromocion = async (idSuscripcion: number, data: AsignarPromocionDto): Promise<void> => {
    await apiClient.post(`${API_URL_BASE}/${idSuscripcion}/promociones`, data);
};

const quitarPromocion = async (idSuscripcion: number, idPromocion: number): Promise<void> => {
    await apiClient.delete(`${API_URL_BASE}/${idSuscripcion}/promociones/${idPromocion}`);
};

export default {
    getSuscripcionesPorSuscriptor,
    getSuscripcionById,
    createSuscripcion,
    updateSuscripcion,
    getPromocionesAsignadas,
    getPromocionesDisponibles,
    asignarPromocion,
    quitarPromocion,
};