// 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 } from '@angular/router';
import { ConfigService } from '../../providers/config.service';
import { LayoutService } from '../../providers/layout.service';
import { CondoUnitsService } from '../../providers/condo-units.service';
import { AssembleeService } from '../../providers/assemblee.service';
import { FunctionService } from '../../providers/function.service';
import { CondoUnit, CondoUnitMember, CONDO_UNIT_TYPE_OPTIONS, MILLESIMI_TOTALI } from '../../models/condo-unit.model';

// i condòmini sono clienti di tipo "Ditta Individuale" (come sul web)
const CUSTOMER_TYPE_DITTA_INDIVIDUALE = 2;

@Component({
	selector: 'app-condo-units-list',
	templateUrl: './condo-units-list.page.html',
	styleUrls: ['./condo-units-list.page.scss'],
	standalone: false,
})
export class CondoUnitsListPage {
	cmp_id = 0;
	prt_id = 0;
	// vista pilotata dalla funzione di modulo 'unita_immobiliari_gestione' (gestione completa = admin);
	// senza la funzione = vista condomino (solo le SUE unità). getMyCustomer serve solo per i dati del condomino.
	moduleName = 'Assemblee';
	canManage = false;
	isCondomino = false;
	myCstId = 0;
	loading = false;

	filtered: CondoUnit[] = [];
	search = '';
	private searchTimer: any;
	millesimiTotali = 0;
	readonly MILLESIMI_TOTALI = MILLESIMI_TOTALI;

	// opzioni referente per unità (cst_id → [{cst_id, display}])
	membersByUnit: { [unitId: number]: { value: number; label: string }[] } = {};

	// --- form crea/modifica unità (solo admin/canManage) ---
	showForm = false;
	saving = false;
	unit: CondoUnit = this.emptyUnit();
	tipoOptions = CONDO_UNIT_TYPE_OPTIONS;
	condomini: { value: number; label: string }[] = [];

	constructor(
		private route: ActivatedRoute,
		private config: ConfigService,
		public layout: LayoutService,
		private service: CondoUnitsService,
		private assemblee: AssembleeService,
		private funService: FunctionService,
	) {}

	ionViewWillEnter() {
		this.resolveIds();
		this.layout.setPageConfig({ title: 'Unità Immobiliari', showBack: true, backButtonHref: '/servizi' });
		this.funService.funzionibyuser(this.moduleName).subscribe((res: any[]) => {
			const funcs = (res || []).map((f) => f.mdfu_function);
			this.canManage = funcs.includes('unita_immobiliari_gestione');
			this.isCondomino = !this.canManage;
			if (this.canManage) {
				this.loadCondomini();
				this.load();
			} else {
				// condomino: serve il suo cst_id per caricare solo le SUE unità
				this.assemblee.getMyCustomer(this.cmp_id).subscribe((cst) => {
					this.myCstId = cst || 0;
					this.load();
				});
			}
		});
	}

	private resolveIds() {
		let r: ActivatedRoute | null = this.route;
		while (r) {
			const pm = r.snapshot.paramMap;
			if (pm.get('cmp_id')) this.cmp_id = +(pm.get('cmp_id') as string);
			if (pm.get('prt_id')) this.prt_id = +(pm.get('prt_id') as string);
			r = r.parent;
		}
	}

	load(ev?: any) {
		this.loading = true;
		// ricerca server-side: admin → txtsearch al backend; condomino → solo le sue unità (endpoint senza filtro)
		const obs = this.isCondomino ? this.service.getCondoUnitsByCustomer(this.myCstId) : this.service.getCondoUnits(this.cmp_id, this.search || '');
		obs.subscribe({
			next: (rows: CondoUnit[]) => {
				this.filtered = rows || [];
				this.millesimiTotali = this.filtered.length > 0 ? Number(this.filtered[0].millesimi_totali || 0) : 0;
				this.filtered.forEach((u) => this.loadMembers(u.unit_id));
				this.loading = false;
				ev?.target?.complete();
			},
			error: () => {
				this.config.presentToastError('Errore nel caricamento delle unità');
				this.loading = false;
				ev?.target?.complete();
			},
		});
	}

	private loadMembers(unitId: number) {
		this.service.getCondoUnitMembers(unitId).subscribe((members) => {
			this.membersByUnit[unitId] = (members || []).map((m) => ({ value: m.ucm_cst_id, label: m.cst_display }));
		});
	}

	// ricerca lato backend, con piccolo debounce per non chiamare l'endpoint a ogni tasto
	onSearch() {
		clearTimeout(this.searchTimer);
		this.searchTimer = setTimeout(() => this.load(), 350);
	}

	get millesimiOk(): boolean {
		return Math.abs(this.millesimiTotali - MILLESIMI_TOTALI) < 0.01;
	}

	typeIcon(t: string): string {
		return CONDO_UNIT_TYPE_OPTIONS.find((o) => o.value === t)?.icon || 'home-outline';
	}
	typeLabel(t: string): string {
		return CONDO_UNIT_TYPE_OPTIONS.find((o) => o.value === t)?.label || t;
	}

	// --- crea / modifica unità ---
	private emptyUnit(): CondoUnit {
		return {
			unit_id: 0,
			unit_cmp_id: 0,
			unit_type: 'appartamento',
			unit_scala: '',
			unit_piano: '',
			unit_interno: '',
			unit_descrizione: '',
			unit_millesimi: 0,
			referente_id: null,
			cst_ids: [],
		};
	}

	private loadCondomini() {
		this.service.getCustomers(this.cmp_id).subscribe((rows: any[]) => {
			this.condomini = (rows || [])
				.filter((c: any) => Number(c.cst_type ?? c.cts_type) === CUSTOMER_TYPE_DITTA_INDIVIDUALE)
				.map((c: any) => ({
					value: c.id ?? c.cst_id,
					label: ((c.name || '') + ' ' + (c.surname || '')).trim() || c.description || c.cst_display || '#' + (c.id ?? c.cst_id),
				}));
		});
	}

	// opzioni referente = solo i condòmini selezionati come membri
	get referenteOptions(): { value: number; label: string }[] {
		const ids = this.unit.cst_ids || [];
		return this.condomini.filter((c) => ids.includes(c.value));
	}

	onMembersChange() {
		const ids = this.unit.cst_ids || [];
		if (!this.unit.referente_id || !ids.includes(this.unit.referente_id)) {
			this.unit.referente_id = ids.length > 0 ? ids[0] : null;
		}
	}

	nuovaUnita() {
		this.unit = this.emptyUnit();
		this.unit.unit_cmp_id = this.cmp_id;
		this.showForm = true;
	}

	modificaUnita(u: CondoUnit) {
		if (!this.canManage) return;
		this.unit = { ...u };
		// carica i membri attuali per multiselect e referente
		this.service.getCondoUnitMembers(u.unit_id).subscribe((members: CondoUnitMember[]) => {
			this.unit.cst_ids = (members || []).map((m) => m.ucm_cst_id);
			const ref = (members || []).find((m) => m.ucm_referente);
			this.unit.referente_id = ref ? ref.ucm_cst_id : u.referente_id || null;
			this.showForm = true;
		});
	}

	chiudiForm() {
		this.showForm = false;
	}

	salvaUnita() {
		if (!this.unit.cst_ids || this.unit.cst_ids.length === 0) {
			this.config.presentToastWarning('Seleziona almeno un condòmino');
			return;
		}
		if (!this.unit.referente_id || !this.unit.cst_ids.includes(this.unit.referente_id)) {
			this.unit.referente_id = this.unit.cst_ids[0];
		}
		this.unit.unit_cmp_id = this.cmp_id;
		this.saving = true;
		this.service.addUpdCondoUnit(this.unit).subscribe({
			next: () => {
				this.saving = false;
				this.showForm = false;
				this.config.presentToastSuccess('Unità salvata');
				this.load();
			},
			error: () => {
				this.saving = false;
				this.config.presentToastError('Errore nel salvataggio dell\'unità');
			},
		});
	}

	cambiaReferente(u: CondoUnit) {
		if (!u.referente_id) return;
		this.service.setCondoUnitReferente(u.unit_id, u.referente_id).subscribe({
			next: () => this.config.presentToastSuccess('Referente aggiornato'),
			error: () => {
				this.config.presentToastError('Errore aggiornamento referente');
				this.load();
			},
		});
	}
}
