// Questo file fa parte di MyTown.
// MyTown è software libero: puoi ridistribuirlo e/o modificarlo secondo
// i termini della GNU Affero General Public License come pubblicata dalla
// Free Software Foundation, versione 3.
// Distribuito senza ALCUNA GARANZIA; vedi la GNU AGPL v3 per i dettagli.
// Copyright (C) Kondor Consulting & Services S.r.l.
// SPDX-License-Identifier: AGPL-3.0-or-later

/**
 * Modelli per la richiesta/emissione fattura verso Fatture in Cloud (backend ws_spring_cmp).
 * La richiesta parte dal checkout (prenotazione o shop) su scelta del cliente; a pagamento
 * confermato la fattura viene creata in sf_fatture (fat_fic_stato = DA_INVIARE) e lo scheduler
 * la invia a SDI. La stampa è disponibile nelle liste una volta emessa.
 */

export type TipoCliente = 'AZIENDA' | 'PRIVATO';

export type StatoFattura = 'NESSUNA' | 'DA_INVIARE' | 'CREATA_NON_INVIATA' | 'INVIATA' | 'ERRORE';

export type ModuloFattura = 'BOOKING' | 'BOOKING_ORDER' | 'ECOMMERCE';

/** Dati fiscali del cessionario (cliente). Persistiti/aggiornati in cmp_customers. */
export interface DatiFiscali {
	tipo: TipoCliente;
	ragioneSociale?: string; // AZIENDA
	nome?: string; // PRIVATO
	cognome?: string; // PRIVATO
	pIva?: string; // AZIENDA (obbligatoria)
	codFiscale?: string; // PRIVATO (obbligatorio)
	indirizzo?: string;
	civico?: string;
	cap?: string;
	citta?: string;
	prov?: string;
	nazione?: string; // default 'IT'
	pec?: string;
	codiceDest?: string; // Codice Destinatario SDI ('0000000' per privato senza codice)
}

export interface RigaFattura {
	descrizione: string;
	quantita: number;
	unitaMisura?: string;
	prezzoUnitario: number; // netto (imponibile) unitario
	aliquotaIVA: number; // es. 22
	natura?: string; // N1..N7 se non imponibile/esente
}

export interface PagamentoFattura {
	metodoSdi: string; // MP01 contanti | MP05 bonifico | MP08 carta
	pagata: boolean;
	dataPagamento: string; // 'yyyy-MM-dd'
}

/** Payload inviato al backend per creare la fattura in uscita. */
export interface RichiestaFatturaPayload {
	cmp_id: number;
	module: ModuloFattura;
	entity_id: number; // bkb_id | ord_id
	pt_uid?: string; // opzionale: transazione di pagamento collegata
	datiFiscali: DatiFiscali;
	righe: RigaFattura[];
	pagamento: PagamentoFattura;
}

/** Stato fattura per una riga di lista (ordine/prenotazione). */
export interface StatoFatturaResp {
	esiste: boolean;
	fatId?: number;
	stato?: StatoFattura;
	numero?: string;
}

/** True se i dati fiscali sono sufficienti a fatturare (identità fiscale + recapito SDI). */
export function datiFiscaliCompleti(d: DatiFiscali | null | undefined): boolean {
	if (!d) return false;
	const idOk = d.tipo === 'AZIENDA' ? !!(d.pIva && d.pIva.trim()) : !!(d.codFiscale && d.codFiscale.trim());
	const recapitoOk = !!(d.pec && d.pec.trim()) || !!(d.codiceDest && d.codiceDest.trim());
	return idOk && recapitoOk;
}
