// 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 del modulo Workflow (lato app).
 * Rispecchiano le strutture del portale Angular (ws_spring_workflow):
 *  - WfInstance / WfJob : storico e attività
 *  - WfActivity / WfComponent / WfCampo : forma dinamica eseguita (solo execute)
 *
 * Nota: il backend filtra già per ruolo/utente cosa è visibile ed eseguibile,
 * quindi l'app non applica alcun gating per ruolo.
 */

export interface WfInstance {
	// identificativo istanza: la lista (wf_get_instances) ritorna wfin_instance
	wfin_instance?: number | string;
	wfin_id?: string;
	// la lista ritorna wf_name (nome workflow, arricchito con instance_name) e wfj_description (stato corrente)
	wf_name?: string;
	wfin_description?: string;
	wfj_description?: string;
	wfin_dateins?: string;
	wfin_state?: number;
	// presente solo nel dettaglio
	jobs?: WfJob[];
}

/** Voce di "attività che posso iniziare" (activity/list_by_user). */
export interface WfStartable {
	wf_id: number;
	wf_name: string;
}

export interface WfJob {
	wfj_id: string;
	wfj_data?: string; // JSON stringificato dell'attività
	wfj_state?: number; // 0 = aperto/in corso, 1 = completato
	wfj_dateins?: string;
	wfj_detail?: string;
	wfj_description?: string;
	wfin_id?: string;
	wf_id?: number;
	// popolato lato app dopo il parse di wfj_data
	activity?: WfActivity;
}

export interface WfCampo {
	name: string;
	label: string;
	// Tipi (allineati a campi_form del portale):
	// 0=numero, 2=data, 3=combo, 4=email, 5=tel, 6=password, 7=multiselect,
	// 8=file upload, 9=nota/istruzioni (read-only), 14=datetime; default=testo/textarea
	type: number;
	visible?: boolean;
	multiline?: boolean; // se true (sui tipi testo) => textarea
	option?: { value: string; text: string }[];
	option_search?: string; // 'activity_next', 'link', 'roles', ...
	value?: string;
	value_list?: any[];
	file?: WfUploadedFile[]; // type 8: file caricati
	disabled?: boolean;
	required?: boolean;
	settings?: boolean; // true => campo di configurazione, non da mostrare in execute
	row?: number;
	column?: number;
}

/** File caricato in un campo type 8 (formato atteso dal backend workflow). */
export interface WfUploadedFile {
	fileOrigName: string;
	repositoryName: string; // path temp restituito da insert_pdf_file_in_folder_temp
}

export interface WfComponent {
	cm_id?: number;
	cm_module_name?: string; // es. 'button_ok', 'view_form', 'Notifica'
	cm_description?: string;
	cm_settings?: string;
	campi?: WfCampo[];
	row?: number;
	column?: number;
	title?: string;
}

export interface WfActivity {
	index?: number;
	label?: string;
	link?: string;
	components?: WfComponent[];
	campi?: WfCampo[];
	snapshot?: WfSnapshot;
}

/**
 * Snapshot dei dati di un'entità referenziata da un link a un modulo web.
 * NON è presente di default: va popolato LATO PORTALE WEB dentro wfj_data,
 * così l'app lo mostra read-only senza conoscere i singoli moduli.
 */
export interface WfSnapshot {
	title?: string;
	fields?: { label: string; value: string }[];
	files?: WfSnapshotFile[];
}

export interface WfSnapshotFile {
	drfl_id: number; // id file documentale (per file/file_dwn_zip)
	filename?: string;
	mime?: string;
}
