import api from './api';
import { Evento, StatoEvento, CalendarEvent, EventoDettaglioOspiti, EventoDettaglioPrelievo, EventoDettaglioRisorsa, EventoAcconto, EventoAltroCosto, EventoDegustazione } from '../types';

export const eventiService = {
  getAll: async (params?: {
    dataInizio?: string;
    dataFine?: string;
    stato?: StatoEvento;
    clienteId?: number;
    locationId?: number;
  }) => {
    const { data } = await api.get<Evento[]>('/eventi', { params });
    return data;
  },

  getById: async (id: number) => {
    const { data } = await api.get<Evento>(`/eventi/${id}`);
    return data;
  },

  create: async (evento: Partial<Evento>) => {
    const { data } = await api.post<Evento>('/eventi', evento);
    return data;
  },

  update: async (id: number, evento: Partial<Evento>) => {
    await api.put(`/eventi/${id}`, { ...evento, id });
  },

  delete: async (id: number) => {
    await api.delete(`/eventi/${id}`);
  },

  duplica: async (id: number) => {
    const { data } = await api.post<Evento>(`/eventi/${id}/duplica`);
    return data;
  },

  cambiaStato: async (id: number, nuovoStato: StatoEvento) => {
    const { data } = await api.post<Evento>(`/eventi/${id}/cambia-stato`, { nuovoStato });
    return data;
  },

  ricalcolaQuantita: async (id: number) => {
    const { data } = await api.post<Evento>(`/eventi/${id}/ricalcola-quantita`);
    return data;
  },

  ricalcolaAcconti: async (id: number) => {
    const { data } = await api.post<Evento>(`/eventi/${id}/ricalcola-acconti`);
    return data;
  },

  getCalendario: async (dataInizio: string, dataFine: string) => {
    const { data } = await api.get<CalendarEvent[]>('/eventi/calendario', {
      params: { dataInizio, dataFine }
    });
    return data;
  },

  // Dettagli Ospiti
  getOspiti: async (eventoId: number) => {
    const { data } = await api.get<EventoDettaglioOspiti[]>(`/eventi/${eventoId}/ospiti`);
    return data;
  },
  addOspite: async (eventoId: number, ospite: Partial<EventoDettaglioOspiti>) => {
    const { data } = await api.post<EventoDettaglioOspiti>(`/eventi/${eventoId}/ospiti`, ospite);
    return data;
  },
  updateOspite: async (eventoId: number, id: number, ospite: Partial<EventoDettaglioOspiti>) => {
    await api.put(`/eventi/${eventoId}/ospiti/${id}`, { ...ospite, id, eventoId });
  },
  deleteOspite: async (eventoId: number, id: number) => {
    await api.delete(`/eventi/${eventoId}/ospiti/${id}`);
  },

  // Dettagli Prelievo
  getPrelievo: async (eventoId: number) => {
    const { data } = await api.get<EventoDettaglioPrelievo[]>(`/eventi/${eventoId}/prelievo`);
    return data;
  },
  addPrelievo: async (eventoId: number, prelievo: Partial<EventoDettaglioPrelievo>) => {
    const { data } = await api.post<EventoDettaglioPrelievo>(`/eventi/${eventoId}/prelievo`, prelievo);
    return data;
  },
  updatePrelievo: async (eventoId: number, id: number, prelievo: Partial<EventoDettaglioPrelievo>) => {
    await api.put(`/eventi/${eventoId}/prelievo/${id}`, { ...prelievo, id, eventoId });
  },
  deletePrelievo: async (eventoId: number, id: number) => {
    await api.delete(`/eventi/${eventoId}/prelievo/${id}`);
  },

  // Dettagli Risorse
  getRisorse: async (eventoId: number) => {
    const { data } = await api.get<EventoDettaglioRisorsa[]>(`/eventi/${eventoId}/risorse`);
    return data;
  },
  addRisorsa: async (eventoId: number, risorsa: Partial<EventoDettaglioRisorsa>) => {
    const { data } = await api.post<EventoDettaglioRisorsa>(`/eventi/${eventoId}/risorse`, risorsa);
    return data;
  },
  updateRisorsa: async (eventoId: number, id: number, risorsa: Partial<EventoDettaglioRisorsa>) => {
    await api.put(`/eventi/${eventoId}/risorse/${id}`, { ...risorsa, id, eventoId });
  },
  deleteRisorsa: async (eventoId: number, id: number) => {
    await api.delete(`/eventi/${eventoId}/risorse/${id}`);
  },

  // Acconti
  getAcconti: async (eventoId: number) => {
    const { data } = await api.get<EventoAcconto[]>(`/eventi/${eventoId}/acconti`);
    return data;
  },
  addAcconto: async (eventoId: number, acconto: Partial<EventoAcconto>) => {
    const { data } = await api.post<EventoAcconto>(`/eventi/${eventoId}/acconti`, acconto);
    return data;
  },
  updateAcconto: async (eventoId: number, id: number, acconto: Partial<EventoAcconto>) => {
    await api.put(`/eventi/${eventoId}/acconti/${id}`, { ...acconto, id, eventoId });
  },
  deleteAcconto: async (eventoId: number, id: number) => {
    await api.delete(`/eventi/${eventoId}/acconti/${id}`);
  },

  // Altri Costi
  getAltriCosti: async (eventoId: number) => {
    const { data } = await api.get<EventoAltroCosto[]>(`/eventi/${eventoId}/altri-costi`);
    return data;
  },
  addAltroCosto: async (eventoId: number, costo: Partial<EventoAltroCosto>) => {
    const { data } = await api.post<EventoAltroCosto>(`/eventi/${eventoId}/altri-costi`, costo);
    return data;
  },
  updateAltroCosto: async (eventoId: number, id: number, costo: Partial<EventoAltroCosto>) => {
    await api.put(`/eventi/${eventoId}/altri-costi/${id}`, { ...costo, id, eventoId });
  },
  deleteAltroCosto: async (eventoId: number, id: number) => {
    await api.delete(`/eventi/${eventoId}/altri-costi/${id}`);
  },

  // Degustazioni
  getDegustazioni: async (eventoId: number) => {
    const { data } = await api.get<EventoDegustazione[]>(`/eventi/${eventoId}/degustazioni`);
    return data;
  },
  addDegustazione: async (eventoId: number, degustazione: Partial<EventoDegustazione>) => {
    const { data } = await api.post<EventoDegustazione>(`/eventi/${eventoId}/degustazioni`, degustazione);
    return data;
  },
  updateDegustazione: async (eventoId: number, id: number, degustazione: Partial<EventoDegustazione>) => {
    await api.put(`/eventi/${eventoId}/degustazioni/${id}`, { ...degustazione, id, eventoId });
  },
  deleteDegustazione: async (eventoId: number, id: number) => {
    await api.delete(`/eventi/${eventoId}/degustazioni/${id}`);
  },
};
