// 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 { ServiceTypeMode } from './service-type.model';

export type AppointmentStatus =
	| 'IN_ATTESA'
	| 'PROPOSTA_RICEVUTA'
	| 'ATTENDE_CONFERMA'
	| 'CONFERMATO'
	| 'IN_CORSO'
	| 'COMPLETATO'
	| 'ANNULLATO'
	| 'RIFIUTATO'
	| 'PREVENTIVO_INVIATO'
	| 'PREVENTIVO_ACCETTATO'
	| 'PREVENTIVO_RIFIUTATO';

export const AppointmentStatusOptions = [
	{ label: 'Tutti', value: '' },
	{ label: 'In Attesa', value: 'IN_ATTESA' },
	{ label: 'Proposta Ricevuta', value: 'PROPOSTA_RICEVUTA' },
	{ label: 'Attende Conferma', value: 'ATTENDE_CONFERMA' },
	{ label: 'Confermato', value: 'CONFERMATO' },
	{ label: 'In Corso', value: 'IN_CORSO' },
	{ label: 'Completato', value: 'COMPLETATO' },
	{ label: 'Annullato', value: 'ANNULLATO' },
	{ label: 'Rifiutato', value: 'RIFIUTATO' },
	{ label: 'Preventivo Inviato', value: 'PREVENTIVO_INVIATO' },
	{ label: 'Preventivo Accettato', value: 'PREVENTIVO_ACCETTATO' },
	{ label: 'Preventivo Rifiutato', value: 'PREVENTIVO_RIFIUTATO' },
];

export const AppointmentStatusSeverity: Record<AppointmentStatus, string> = {
	IN_ATTESA: 'info',
	PROPOSTA_RICEVUTA: 'warn',
	ATTENDE_CONFERMA: 'warn',
	CONFERMATO: 'success',
	IN_CORSO: 'primary',
	COMPLETATO: 'success',
	ANNULLATO: 'danger',
	RIFIUTATO: 'danger',
	PREVENTIVO_INVIATO: 'warn',
	PREVENTIVO_ACCETTATO: 'info',
	PREVENTIVO_RIFIUTATO: 'danger',
};

export const AppointmentStatusColors: Record<AppointmentStatus, string> = {
	IN_ATTESA: '#3B82F6',
	PROPOSTA_RICEVUTA: '#F59E0B',
	ATTENDE_CONFERMA: '#F59E0B',
	CONFERMATO: '#22C55E',
	IN_CORSO: '#6366F1',
	COMPLETATO: '#16A34A',
	ANNULLATO: '#EF4444',
	RIFIUTATO: '#DC2626',
	PREVENTIVO_INVIATO: '#F59E0B',
	PREVENTIVO_ACCETTATO: '#06B6D4',
	PREVENTIVO_RIFIUTATO: '#DC2626',
};

export interface Appointment {
	apt_id: number;
	apt_cmp_id: number;
	apt_service_type_id: number;
	apt_client_usr_id: number;
	apt_operator_em_id: number | null;
	apt_status: AppointmentStatus;
	apt_requested_date: string | null;
	apt_requested_time: string | null;
	apt_proposed_date: string | null;
	apt_proposed_time: string | null;
	apt_confirmed_date: string | null;
	apt_confirmed_time: string | null;
	apt_duration_minutes: number;
	apt_client_notes: string;
	apt_operator_notes: string;
	apt_cancellation_reason: string;
	apt_rejection_reason: string;
	apt_created_at: string;
	apt_updated_at: string;
	apt_created_by: number;
	apt_active: boolean;
	apt_service_type_ids?: string; // comma-separated IDs for multi-service appointments

	// Preventivo (modalità SU_PREVENTIVO)
	apt_quote_amount?: number | null;
	apt_quote_description?: string | null;
	apt_quote_valid_until?: string | null;

	// Evento programmatico / manutenzione ricorrente
	apt_programmatic_due_date?: string | null;
	apt_programmatic_reminder_sent?: boolean | null;
	apt_recurrence_months?: number | null; // intervallo ricorrenza in mesi (12=annuale); null = scadenza singola
	apt_reminder_lead_days?: number | null; // giorni di anticipo del promemoria (default 30)

	// Join fields
	client_firstname?: string;
	client_lastname?: string;
	client_email?: string;
	client_phone?: string;
	operator_firstname?: string;
	operator_lastname?: string;
	service_type_name?: string;
	service_type_mode?: ServiceTypeMode;
	service_type_color?: string;

	// Related data (loaded in detail)
	status_history?: AppointmentStatusChange[];
	attachment_count?: number;
	message_count?: number;
	unread_message_count?: number;

	// Pagination
	totalrows?: number;
}

export interface AppointmentStatusChange {
	asc_id: number;
	asc_apt_id: number;
	asc_old_status: AppointmentStatus | null;
	asc_new_status: AppointmentStatus;
	asc_changed_by: number;
	asc_changed_at: string;
	asc_notes: string;
	changed_by_firstname?: string;
	changed_by_lastname?: string;
}

export interface AppointmentFilter {
	status?: string;
	service_type_id?: number;
	operator_em_id?: number;
	client_usr_id?: number;
	date_from?: string | Date;
	date_to?: string | Date;
}

export interface StatusTransitionRequest {
	new_status: AppointmentStatus;
	notes?: string;
	proposed_date?: string;
	proposed_time?: string;
	operator_em_id?: number | null; // operatore assegnato dal gestore in fase di proposta data
	rejection_reason?: string;
	cancellation_reason?: string;
	// Preventivo (transizione verso PREVENTIVO_INVIATO)
	quote_amount?: number | null;
	quote_description?: string;
	quote_valid_until?: string;
}
