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

export interface BaseEntity {
  id: number;
  createdAt?: string;
  createdBy?: string;
  updatedAt?: string;
  updatedBy?: string;
}

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;
}

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;
}

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

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

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

export interface TipoMateriale 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;
}

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

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

export interface Evento extends BaseEntity {
  codice?: string;
  dataEvento: string;
  oraInizio?: string;
  oraFine?: string;
  clienteId?: number;
  cliente?: Cliente;
  locationId?: number;
  location?: Location;
  tipoEventoId?: number;
  tipoEvento?: TipoEvento;
  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;
  dettagliOspiti?: EventoDettaglioOspiti[];
  dettagliPrelievo?: EventoDettaglioPrelievo[];
  dettagliRisorse?: EventoDettaglioRisorsa[];
  acconti?: EventoAcconto[];
  altriCosti?: EventoAltroCosto[];
  degustazioni?: EventoDegustazione[];
}

export interface EventoDettaglioOspiti extends BaseEntity {
  eventoId: number;
  tipoOspiteId: number;
  tipoOspite?: TipoOspite;
  quantita: number;
  note?: string;
}

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

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

export interface EventoAcconto extends BaseEntity {
  eventoId: number;
  descrizione?: string;
  importo: number;
  dataPagamento?: string;
  aConferma: boolean;
  ordine: number;
  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;
}

// DTOs per 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;
}

export interface EventoAltroCostoDto {
  descrizione: string;
  costoUnitario: number;
  quantita?: number;
  ordine?: number;
  applicaIva?: boolean;
  aliquotaIva?: number;
}

export interface EventoAccontoDto {
  descrizione?: string;
  importo: number;
  dataPagamento?: string;
  aConferma?: boolean;
  ordine?: number;
  metodoPagamento?: string;
  note?: string;
}

export interface PagaAccontoDto {
  dataPagamento?: string;
  metodoPagamento?: string;
  note?: string;
}

export interface EventoDegustazione extends BaseEntity {
  eventoId: number;
  dataDegustazione: string;
  ora?: string;
  numeroPartecipanti?: number;
  luogo?: string;
  note?: string;
  completata: boolean;
}

export interface CalendarEvent {
  id: number;
  codice?: string;
  title: string;
  start: string;
  end: string;
  stato: StatoEvento;
  color: string;
  numeroOspiti?: number;
  cliente: string;
  location: string;
}

export interface LookupItem {
  id: number;
  codice?: string;
  descrizione?: string;
  nome?: string;
  cognome?: string;
  ragioneSociale?: string;
  citta?: string;
  tipo?: string;
}
