import axios from "axios";
import type {
  Evento,
  Cliente,
  Location,
  Articolo,
  Risorsa,
  TipoEvento,
  TipoMateriale,
  TipoRisorsa,
  TipoOspite,
  CodiceCategoria,
  EventoDettaglioOspiti,
  EventoDettaglioPrelievo,
  EventoDettaglioRisorsa,
  EventoAcconto,
  EventoAltroCosto,
  EventoCostiRiepilogo,
} from "../types";

const API_BASE_URL = "http://localhost:5000/api";

const api = axios.create({
  baseURL: API_BASE_URL,
  headers: {
    "Content-Type": "application/json",
  },
});

// Eventi
export const eventiApi = {
  getAll: () => api.get<Evento[]>("/eventi").then((res) => res.data),
  getById: (id: number) =>
    api.get<Evento>(`/eventi/${id}`).then((res) => res.data),
  create: (evento: Partial<Evento>) =>
    api.post<Evento>("/eventi", evento).then((res) => res.data),
  update: (id: number, evento: Partial<Evento>) =>
    api.put<Evento>(`/eventi/${id}`, evento).then((res) => res.data),
  delete: (id: number) => api.delete(`/eventi/${id}`),
  duplicate: (id: number) =>
    api.post<Evento>(`/eventi/${id}/duplica`).then((res) => res.data),
  ricalcolaQuantita: (id: number) =>
    api.post(`/eventi/${id}/ricalcola-quantita`),
  cambiaStato: (id: number, nuovoStato: number) =>
    api.post(`/eventi/${id}/cambia-stato`, { nuovoStato }),
};

// Clienti
export const clientiApi = {
  getAll: () => api.get<Cliente[]>("/clienti").then((res) => res.data),
  getById: (id: number) =>
    api.get<Cliente>(`/clienti/${id}`).then((res) => res.data),
  create: (cliente: Partial<Cliente>) =>
    api.post<Cliente>("/clienti", cliente).then((res) => res.data),
  update: (id: number, cliente: Partial<Cliente>) =>
    api.put<Cliente>(`/clienti/${id}`, cliente).then((res) => res.data),
  delete: (id: number) => api.delete(`/clienti/${id}`),
};

// Location
export const locationApi = {
  getAll: () => api.get<Location[]>("/location").then((res) => res.data),
  getById: (id: number) =>
    api.get<Location>(`/location/${id}`).then((res) => res.data),
  create: (location: Partial<Location>) =>
    api.post<Location>("/location", location).then((res) => res.data),
  update: (id: number, location: Partial<Location>) =>
    api.put<Location>(`/location/${id}`, location).then((res) => res.data),
  delete: (id: number) => api.delete(`/location/${id}`),
};

// Articoli
export const articoliApi = {
  getAll: () => api.get<Articolo[]>("/articoli").then((res) => res.data),
  getById: (id: number) =>
    api.get<Articolo>(`/articoli/${id}`).then((res) => res.data),
  create: (articolo: Partial<Articolo>) =>
    api.post<Articolo>("/articoli", articolo).then((res) => res.data),
  update: (id: number, articolo: Partial<Articolo>) =>
    api.put<Articolo>(`/articoli/${id}`, articolo).then((res) => res.data),
  delete: (id: number) => api.delete(`/articoli/${id}`),
};

// Risorse
export const risorseApi = {
  getAll: () => api.get<Risorsa[]>("/risorse").then((res) => res.data),
  getById: (id: number) =>
    api.get<Risorsa>(`/risorse/${id}`).then((res) => res.data),
  create: (risorsa: Partial<Risorsa>) =>
    api.post<Risorsa>("/risorse", risorsa).then((res) => res.data),
  update: (id: number, risorsa: Partial<Risorsa>) =>
    api.put<Risorsa>(`/risorse/${id}`, risorsa).then((res) => res.data),
  delete: (id: number) => api.delete(`/risorse/${id}`),
};

// Lookup APIs
export const tipiEventoApi = {
  getAll: () => api.get<TipoEvento[]>("/tipi-evento").then((res) => res.data),
};

export const tipiMaterialeApi = {
  getAll: () =>
    api.get<TipoMateriale[]>("/tipi-materiale").then((res) => res.data),
};

export const tipiRisorsaApi = {
  getAll: () => api.get<TipoRisorsa[]>("/tipi-risorsa").then((res) => res.data),
};

export const tipiOspiteApi = {
  getAll: () => api.get<TipoOspite[]>("/tipi-ospite").then((res) => res.data),
};

export const codiciCategoriaApi = {
  getAll: () =>
    api.get<CodiceCategoria[]>("/codici-categoria").then((res) => res.data),
};

// Event details APIs
export const eventoDettaglioOspitiApi = {
  getByEventoId: (eventoId: number) =>
    api
      .get<EventoDettaglioOspiti[]>(`/eventi/${eventoId}/ospiti`)
      .then((res) => res.data),
  create: (eventoId: number, dettaglio: Partial<EventoDettaglioOspiti>) =>
    api
      .post<EventoDettaglioOspiti>(`/eventi/${eventoId}/ospiti`, dettaglio)
      .then((res) => res.data),
  update: (
    eventoId: number,
    id: number,
    dettaglio: Partial<EventoDettaglioOspiti>,
  ) =>
    api
      .put<EventoDettaglioOspiti>(`/eventi/${eventoId}/ospiti/${id}`, dettaglio)
      .then((res) => res.data),
  delete: (eventoId: number, id: number) =>
    api.delete(`/eventi/${eventoId}/ospiti/${id}`),
};

export const eventoDettaglioPrelievoApi = {
  getByEventoId: (eventoId: number) =>
    api
      .get<EventoDettaglioPrelievo[]>(`/eventi/${eventoId}/prelievo`)
      .then((res) => res.data),
  create: (eventoId: number, dettaglio: Partial<EventoDettaglioPrelievo>) =>
    api
      .post<EventoDettaglioPrelievo>(`/eventi/${eventoId}/prelievo`, dettaglio)
      .then((res) => res.data),
  update: (
    eventoId: number,
    id: number,
    dettaglio: Partial<EventoDettaglioPrelievo>,
  ) =>
    api
      .put<EventoDettaglioPrelievo>(
        `/eventi/${eventoId}/prelievo/${id}`,
        dettaglio,
      )
      .then((res) => res.data),
  delete: (eventoId: number, id: number) =>
    api.delete(`/eventi/${eventoId}/prelievo/${id}`),
};

export const eventoDettaglioRisorsaApi = {
  getByEventoId: (eventoId: number) =>
    api
      .get<EventoDettaglioRisorsa[]>(`/eventi/${eventoId}/risorse`)
      .then((res) => res.data),
  create: (eventoId: number, dettaglio: Partial<EventoDettaglioRisorsa>) =>
    api
      .post<EventoDettaglioRisorsa>(`/eventi/${eventoId}/risorse`, dettaglio)
      .then((res) => res.data),
  update: (
    eventoId: number,
    id: number,
    dettaglio: Partial<EventoDettaglioRisorsa>,
  ) =>
    api
      .put<EventoDettaglioRisorsa>(
        `/eventi/${eventoId}/risorse/${id}`,
        dettaglio,
      )
      .then((res) => res.data),
  delete: (eventoId: number, id: number) =>
    api.delete(`/eventi/${eventoId}/risorse/${id}`),
};

// Costi API
export const eventoCostiApi = {
  getRiepilogo: (eventoId: number) =>
    api
      .get<EventoCostiRiepilogo>(`/eventi/${eventoId}/costi/riepilogo`)
      .then((res) => res.data),
  ricalcolaAcconti: (eventoId: number) =>
    api
      .post<EventoCostiRiepilogo>(`/eventi/${eventoId}/costi/ricalcola-acconti`)
      .then((res) => res.data),
};

// Altri Costi API
export const eventoAltriCostiApi = {
  getByEventoId: (eventoId: number) =>
    api
      .get<EventoAltroCosto[]>(`/eventi/${eventoId}/costi/altri`)
      .then((res) => res.data),
  create: (eventoId: number, costo: Partial<EventoAltroCosto>) =>
    api
      .post<EventoAltroCosto>(`/eventi/${eventoId}/costi/altri`, costo)
      .then((res) => res.data),
  update: (eventoId: number, id: number, costo: Partial<EventoAltroCosto>) =>
    api
      .put<EventoAltroCosto>(`/eventi/${eventoId}/costi/altri/${id}`, costo)
      .then((res) => res.data),
  delete: (eventoId: number, id: number) =>
    api.delete(`/eventi/${eventoId}/costi/altri/${id}`),
  riordina: (eventoId: number, ordineIds: number[]) =>
    api.post(`/eventi/${eventoId}/costi/altri/riordina`, ordineIds),
};

// Acconti API
export const eventoAccontiApi = {
  getByEventoId: (eventoId: number) =>
    api
      .get<EventoAcconto[]>(`/eventi/${eventoId}/costi/acconti`)
      .then((res) => res.data),
  create: (eventoId: number, acconto: Partial<EventoAcconto>) =>
    api
      .post<EventoAcconto>(`/eventi/${eventoId}/costi/acconti`, acconto)
      .then((res) => res.data),
  update: (eventoId: number, id: number, acconto: Partial<EventoAcconto>) =>
    api
      .put<EventoAcconto>(`/eventi/${eventoId}/costi/acconti/${id}`, acconto)
      .then((res) => res.data),
  delete: (eventoId: number, id: number) =>
    api.delete(`/eventi/${eventoId}/costi/acconti/${id}`),
  paga: (
    eventoId: number,
    id: number,
    data: { dataPagamento?: string; metodoPagamento?: string; note?: string },
  ) =>
    api
      .post<EventoAcconto>(`/eventi/${eventoId}/costi/acconti/${id}/paga`, data)
      .then((res) => res.data),
};

export default api;
