// Enums
export enum StatoEvento {
  Scheda = 0,
  Preventivo = 10,
  Confermato = 20,
}

// Base entity
export interface BaseEntity {
  id: number;
  createdAt?: string;
  updatedAt?: string;
}

// Cliente
export interface Cliente extends BaseEntity {
  ragioneSociale: string;
  indirizzo?: string;
  cap?: string;
  citta?: string;
  provincia?: string;
  telefono?: string;
  email?: string;
  pec?: string;
  codiceFiscale?: string;
  partitaIva?: string;
  codiceDestinatario?: string;
  note?: string;
  attivo: boolean;
}

// Location
export interface Location extends BaseEntity {
  nome: string;
  indirizzo?: string;
  cap?: string;
  citta?: string;
  provincia?: string;
  telefono?: string;
  email?: string;
  referente?: string;
  distanzaKm?: number;
  note?: string;
  attivo: boolean;
}

// Articolo
export interface Articolo extends BaseEntity {
  codice: string;
  descrizione: string;
  tipoMaterialeId?: number;
  categoriaId?: number;
  qtaDisponibile?: number;
  qtaStdA?: number;
  qtaStdB?: number;
  qtaStdS?: number;
  unitaMisura?: string;
  immagine?: string;
  mimeType?: string;
  note?: string;
  attivo: boolean;
  tipoMateriale?: TipoMateriale;
  categoria?: CodiceCategoria;
}

// Risorsa
export interface Risorsa extends BaseEntity {
  nome: string;
  cognome?: string;
  telefono?: string;
  email?: string;
  tipoRisorsaId?: number;
  note?: string;
  attivo: boolean;
  tipoRisorsa?: TipoRisorsa;
}

// Lookup types
export interface TipoEvento extends BaseEntity {
  codice: string;
  descrizione: string;
  tipoPastoId?: number;
  attivo: boolean;
}

export interface TipoMateriale extends BaseEntity {
  codice: string;
  descrizione: string;
  attivo: boolean;
}

export interface TipoRisorsa extends BaseEntity {
  codice: string;
  descrizione: string;
  attivo: boolean;
}

export interface TipoOspite extends BaseEntity {
  codice: string;
  descrizione: string;
  attivo: boolean;
}

export interface CodiceCategoria extends BaseEntity {
  codice: string;
  descrizione: string;
  coeffA?: number;
  coeffB?: number;
  coeffS?: number;
  attivo: boolean;
}

// Evento detail types
export interface EventoDettaglioOspiti extends BaseEntity {
  eventoId: number;
  tipoOspiteId: number;
  numero: number;
  costoUnitario?: number;
  sconto?: number;
  ordine?: number;
  note?: string;
  costoTotale?: number;
  tipoOspite?: TipoOspite;
}

export interface EventoDettaglioPrelievo extends BaseEntity {
  eventoId: number;
  articoloId: number;
  qtaRichiesta: number;
  qtaCalcolata?: number;
  note?: string;
  articolo?: Articolo;
}

export interface EventoDettaglioRisorsa extends BaseEntity {
  eventoId: number;
  risorsaId: number;
  oreLavoro?: number;
  costo?: number;
  oraInizio?: string;
  oraFine?: string;
  ruolo?: string;
  note?: string;
  risorsa?: Risorsa;
}

export interface EventoAcconto extends BaseEntity {
  eventoId: number;
  dataPagamento?: string;
  importo: number;
  ordine: number;
  aConferma: boolean;
  descrizione?: string;
  metodoPagamento?: string;
  note?: string;
  pagato?: boolean;
}

export interface EventoAltroCosto extends BaseEntity {
  eventoId: number;
  descrizione: string;
  costoUnitario: number;
  quantita: number;
  ordine: number;
  applicaIva: boolean;
  aliquotaIva: number;
  totale?: number;
  totaleConIva?: number;
}

export interface EventoAllegato extends BaseEntity {
  eventoId: number;
  nomeFile: string;
  mimeType?: string;
  dimensione?: number;
  contenuto?: string;
}

export interface EventoDegustazione extends BaseEntity {
  eventoId: number;
  dataDegustazione: string;
  ora?: string;
  numeroPersone?: number;
  numeroPaganti?: number;
  costoDegustazione?: number;
  detraibile: boolean;
  menu?: string;
  luogo?: string;
  note?: string;
  completata: boolean;
  costoTotale?: number;
}

// Main Evento entity
export interface Evento extends BaseEntity {
  codice?: string;
  dataEvento: string;
  oraInizio?: string;
  oraFine?: string;
  clienteId?: number;
  locationId?: number;
  tipoEventoId?: number;
  stato: StatoEvento;
  descrizione?: string;
  numeroOspiti?: number;
  numeroOspitiAdulti?: number;
  numeroOspitiBambini?: number;
  numeroOspitiSeduti?: number;
  numeroOspitiBuffet?: number;
  costoTotale?: number;
  costoPersona?: number;
  totaleAcconti?: number;
  saldo?: number;
  dataScadenzaPreventivo?: string;
  noteInterne?: string;
  noteCliente?: string;
  noteCucina?: string;
  noteAllestimento?: string;
  confermato: boolean;
  cliente?: Cliente;
  location?: Location;
  tipoEvento?: TipoEvento;
  dettagliOspiti?: EventoDettaglioOspiti[];
  dettagliPrelievo?: EventoDettaglioPrelievo[];
  dettagliRisorse?: EventoDettaglioRisorsa[];
  acconti?: EventoAcconto[];
  altriCosti?: EventoAltroCosto[];
  allegati?: EventoAllegato[];
  degustazioni?: EventoDegustazione[];
}

// Riepilogo Costi
export interface EventoCostiRiepilogo {
  costoOspiti: number;
  costoOspitiConIva: number;
  costoRisorse: number;
  costoDegustazioni: number;
  altriCosti: number;
  altriCostiConIva: number;
  totaleLordo: number;
  totaleNettoDegustazioni: number;
  costoTotale: number;
  totaleAccontiPagati: number;
  totaleAccontiPrevisti: number;
  saldo: number;
  numeroOspiti: number;
  costoPerPersona: number;
  dettaglioAltriCosti: DettaglioCosto[];
  dettaglioAcconti: DettaglioAcconto[];
}

export interface DettaglioCosto {
  id: number;
  descrizione: string;
  costoUnitario: number;
  quantita: number;
  totale: number;
  totaleConIva: number;
  applicaIva: boolean;
  aliquotaIva: number;
}

export interface DettaglioAcconto {
  id: number;
  descrizione?: string;
  importo: number;
  dataPagamento?: string;
  pagato: boolean;
  aConferma: boolean;
  ordine: number;
}

// Helper functions
export const getStatoLabel = (stato: StatoEvento): string => {
  switch (stato) {
    case StatoEvento.Scheda:
      return "Scheda";
    case StatoEvento.Preventivo:
      return "Preventivo";
    case StatoEvento.Confermato:
      return "Confermato";
    default:
      return "Sconosciuto";
  }
};

export const getStatoColor = (stato: StatoEvento): string => {
  switch (stato) {
    case StatoEvento.Scheda:
      return "#CAE3FC"; // Blue
    case StatoEvento.Preventivo:
      return "#ffffb8"; // Yellow
    case StatoEvento.Confermato:
      return "#b8ffb8"; // Green
    default:
      return "#ffffff";
  }
};

export const getStatoTextColor = (stato: StatoEvento): string => {
  switch (stato) {
    case StatoEvento.Scheda:
      return "#1565c0";
    case StatoEvento.Preventivo:
      return "#f57c00";
    case StatoEvento.Confermato:
      return "#2e7d32";
    default:
      return "#000000";
  }
};

export const formatCurrency = (value?: number): string => {
  if (value === undefined || value === null) return "€ 0,00";
  return value.toLocaleString("it-IT", {
    style: "currency",
    currency: "EUR",
  });
};
