// 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

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable, of } from 'rxjs';
import { catchError, map } from 'rxjs/operators';

import { ConfigService } from './config.service';
import { DatiFiscali, ModuloFattura, RichiestaFatturaPayload, StatoFatturaResp } from '../models/fattura.model';

/**
 * Richiesta/emissione fattura e stampa. Backend: ws_spring_cmp (serviceUrl_Companies),
 * endpoint sotto scadenziario-fatture/fic/*. Segue il pattern standard { observe:'response' } + map.
 *
 * Endpoint attesi lato backend (Fase 4b, ws_spring_cmp):
 *   GET  scadenziario-fatture/fic/dati-fiscali/{cmp_id}          -> DatiFiscali del cliente dell'utente (o null)
 *   POST scadenziario-fatture/fic/richiedi/{cmp_id}   body payload-> StatoFatturaResp (crea sf_fatture DA_INVIARE + upsert cliente)
 *   GET  scadenziario-fatture/fic/stato/{cmp_id}?module&entityId -> StatoFatturaResp
 *   GET  scadenziario-fatture/fic/stampa/{fatId}                 -> PDF (blob)
 */
@Injectable({ providedIn: 'root' })
export class FatturaService {
	constructor(
		private http: HttpClient,
		private config: ConfigService,
	) {}

	private get base(): string {
		return this.config.serviceUrl_Companies;
	}

	/** Dati fiscali già noti per il cliente dell'utente loggato (null se assenti/incompleti). */
	getMyFiscalData(cmp_id: number): Observable<DatiFiscali | null> {
		return this.http
			.get<DatiFiscali>(`${this.base}scadenziario-fatture/fic/dati-fiscali/${cmp_id}`, { observe: 'response' })
			.pipe(
				map((r) => r.body ?? null),
				catchError(() => of(null)),
			);
	}

	/** Crea la richiesta di fattura (fattura attiva DA_INVIARE) collegata all'ordine/prenotazione. */
	requestInvoice(payload: RichiestaFatturaPayload): Observable<StatoFatturaResp> {
		return this.http
			.post<StatoFatturaResp>(`${this.base}scadenziario-fatture/fic/richiedi/${payload.cmp_id}`, payload, { observe: 'response' })
			.pipe(map((r) => r.body as StatoFatturaResp));
	}

	/** Stato fattura per una riga di lista. Non lancia: su errore ritorna { esiste:false }. */
	getInvoiceStatus(cmp_id: number, module: ModuloFattura, entityId: number): Observable<StatoFatturaResp> {
		return this.http
			.get<StatoFatturaResp>(`${this.base}scadenziario-fatture/fic/stato/${cmp_id}?module=${module}&entityId=${entityId}`, {
				observe: 'response',
			})
			.pipe(
				map((r) => (r.body as StatoFatturaResp) ?? { esiste: false }),
				catchError(() => of({ esiste: false } as StatoFatturaResp)),
			);
	}

	/** Scarica il PDF della fattura (fattura di cortesia / emessa). */
	printInvoice(fatId: number): Observable<Blob> {
		return this.http.get(`${this.base}scadenziario-fatture/fic/stampa/${fatId}`, { responseType: 'blob' });
	}

	/** Apre il PDF ricevuto in una nuova scheda/finestra (helper client). */
	openPdf(blob: Blob): void {
		const url = URL.createObjectURL(blob);
		window.open(url, '_blank');
		// il revoke viene lasciato al browser alla chiusura scheda; per SPA lunghe si può schedulare setTimeout.
	}
}
