// 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 { Component } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router';
import { Subscription } from 'rxjs';
import { ConfigService } from '../../providers/config.service';
import { BookingService } from '../../providers/booking.service';
import { FatturaService } from '../../providers/fattura.service';
import { Booking } from '../../models/booking.model';
import { StatoFatturaResp } from '../../models/fattura.model';

@Component({
	selector: 'app-lista-prenotazioni',
	templateUrl: 'lista-prenotazioni.page.html',
	styleUrls: ['lista-prenotazioni.page.scss'],
	standalone: false,
})
export class ListaPrenotazioniPage {
	cmp_id = 0;
	prt_id = 0;
	selectedSegment = 'tutte';
	allBookings: Booking[] = [];
	filteredBookings: Booking[] = [];
	/** Stato fattura PRENOTAZIONE (BOOKING) per bkb_id. */
	invoiceStatus: Record<number, StatoFatturaResp> = {};
	/** Stato fattura ORDINE (BOOKING_ORDER) per bkb_id. */
	invoiceStatusOrder: Record<number, StatoFatturaResp> = {};

	private paramsSubscription!: Subscription;

	constructor(
		private activatedRoute: ActivatedRoute,
		private router: Router,
		public configService: ConfigService,
		private bookingService: BookingService,
		private fatturaService: FatturaService,
	) {}

	ngOnInit() {
		this.paramsSubscription = this.activatedRoute.params.subscribe((params) => {
			if (params['cmp_id']) this.cmp_id = +params['cmp_id'];
			if (params['prt_id']) this.prt_id = +params['prt_id'];
		});
	}

	ngOnDestroy() {
		this.paramsSubscription?.unsubscribe();
	}

	ionViewWillEnter() {
		this.loadBookings();
	}

	loadBookings(event?: any) {
		this.bookingService.GetBookingListByUser(this.cmp_id).subscribe({
			next: (res) => {
				this.allBookings = res || [];
				this.applyFilter();
				this.loadInvoiceStatuses();
				if (event) event.target.complete();
			},
			error: (err) => {
				this.configService.presentToastError(err);
				if (event) event.target.complete();
			},
		});
	}

	onSegmentChange() {
		this.applyFilter();
	}

	applyFilter() {
		if (this.selectedSegment === 'attive') {
			this.filteredBookings = this.allBookings.filter((b) => b.bkb_status === 'PENDING' || b.bkb_status === 'CONFIRMED');
		} else if (this.selectedSegment === 'completate') {
			this.filteredBookings = this.allBookings.filter((b) => b.bkb_status === 'COMPLETED' || b.bkb_status === 'CANCELLED');
		} else {
			this.filteredBookings = [...this.allBookings];
		}
	}

	getStatusColor(status: string): string {
		switch (status) {
			case 'PENDING': return 'warning';
			case 'CONFIRMED': return 'success';
			case 'COMPLETED': return 'medium';
			case 'CANCELLED': return 'danger';
			default: return 'medium';
		}
	}

	getStatusLabel(status: string): string {
		switch (status) {
			case 'PENDING': return 'In attesa';
			case 'CONFIRMED': return 'Confermata';
			case 'COMPLETED': return 'Completata';
			case 'CANCELLED': return 'Annullata';
			default: return status;
		}
	}

	goToDettaglio(booking: Booking) {
		this.router.navigate(['/portale', this.prt_id, 'company', this.cmp_id, 'service', 'prenotazioni', 'dettaglio', booking.bkb_id]);
	}

	// ── Fattura ──────────────────────────────────────────────────────

	/** Carica lo stato fattura di ogni prenotazione (per il pulsante di stampa). */
	private loadInvoiceStatuses() {
		this.invoiceStatus = {};
		this.invoiceStatusOrder = {};
		for (const b of this.allBookings) {
			if (!b?.bkb_id) continue;
			this.fatturaService.getInvoiceStatus(this.cmp_id, 'BOOKING', b.bkb_id).subscribe((st) => {
				this.invoiceStatus[b.bkb_id] = st;
			});
			this.fatturaService.getInvoiceStatus(this.cmp_id, 'BOOKING_ORDER', b.bkb_id).subscribe((st) => {
				this.invoiceStatusOrder[b.bkb_id] = st;
			});
		}
	}

	/** True se la fattura PRENOTAZIONE è emessa (stampabile). */
	fatturaStampabile(booking: Booking): boolean {
		const st = this.invoiceStatus[booking?.bkb_id];
		// Fattura di cortesia stampabile appena esiste (anche DA_INVIARE), si genera dai dati DB.
		return !!st && st.esiste && !!st.fatId;
	}

	/** True se la fattura ORDINE (menu) è emessa (stampabile). */
	fatturaOrdineStampabile(booking: Booking): boolean {
		const st = this.invoiceStatusOrder[booking?.bkb_id];
		return !!st && st.esiste && !!st.fatId;
	}

	printInvoice(booking: Booking) {
		this._stampa(this.invoiceStatus[booking?.bkb_id]);
	}

	printInvoiceOrder(booking: Booking) {
		this._stampa(this.invoiceStatusOrder[booking?.bkb_id]);
	}

	private _stampa(st: StatoFatturaResp | undefined) {
		if (!st?.fatId) return;
		this.fatturaService.printInvoice(st.fatId).subscribe({
			next: (blob) => this.fatturaService.openPdf(blob),
			error: () => this.configService.presentToastError('Errore nella stampa fattura'),
		});
	}
}
