using MP.Core.DTO;
using MP.Core.Objects;
using MP.Data.DbModels;
using MP.Data.DbModels.Anag;
using MP.Data.MgModels;
using StackExchange.Redis;
using static MP.Core.Objects.Enums;
namespace MP.IOC.Data
{
public interface IMpDataService
{
#region Public Methods
///
/// Verifica se sia da reinviare un taskName alla macchina dall'elenco di quelli salvati (in
/// modalit\u00e0 upsert) se non scaduti
///
/// idx macchina
/// tipo task
/// valore task
/// true se il task \u00e8 stato reinviato
bool AddCheckTask4Machine(string idxMacchina, taskType taskKey, string taskVal);
///
/// Aggiunge un parametro opzionale all'elenco dei saved task (in modalit\u00e0 upsert)
///
/// idx macchina
/// chiave del parametro
/// valore del parametro
/// true se inserito
bool AddOptPar4Machine(string idxMacchina, string taskKey, string taskVal);
///
/// Aggiunge un task all'elenco di quelli salvati (in modalit\u00e0 upsert)
///
/// idx macchina
/// tipo task
/// valore task
/// true se inserito
bool AddTask4Machine(string idxMacchina, taskType taskKey, string taskVal);
///
/// Aggiunge un set di task per macchina all'elenco di quelli salvati (in modalit\u00e0 upsert)
///
/// idx macchina
/// Dizionario di task tipo-valore da salvare
/// true se completato
Task AddTask4MacListAsync(string idxMacchina, Dictionary taskDict);
///
/// Inserimento record allarme su DB
///
/// Data evento
/// Nome macchina
/// Indirizzo memoria PLC
/// Indice memoria
/// Stato valOut
/// Valore decodificato
/// true se inserito
Task AlarmInsertAsync(DateTime dtRif, string idxMacchina, string memAddress, int memIndex, int statusVal, string valDecoded);
///
/// Restituisce l'anagrafica STATI per intero con cache Fusion
///
/// Lista di modelli AnagStatiModel
Task> AnagStatiGetAllAsync();
///
/// Restituisce i modelli di ultimo articolo per data macchina, con cache Fusion
///
/// idx macchina
/// Lista di modelli AnagArticoliModel
Task> ArticoliGetLastByMaccAsync(string idxMacc);
///
/// Effettua lo split dell'ODL corrente per la macchina, con eventuale conferma produzione e
/// gestione slave
///
/// idx macchina
/// effettuare la conferma quantitativa
/// imposta la qty del prossimo ODL da quello che si chiude
/// matricola operatore
/// Step di arrotondamento quantit\u00e0
/// Chiave esterna da associare all'ODL
/// "OK" se successo, "KO" altrimenti
Task AutoStartOdlAsync(string idxMacchina, bool doConfirm, bool qtyFromLast, int matrOpr, int roundStep = 100, string keyRichiesta = "");
///
/// Calcola la ricetta su MongoDB dato modello ricetta corrente
///
/// Modello ricetta da calcolare
/// Risultato del calcolo ricetta
string CalcRecipe(RecipeModel currRecipe);
///
/// Controlla se dal segnale di "microstato" deriva un evento da generare - modalit\u00e0 OFFLINE
///
/// idx macchina
/// valore valOut ingresso
/// data-ora evento (server)
/// sequenza dati inviati
/// dati macchina in cache (opzionale, se null fa lookup)
/// Risultato del processing
Task CheckMicroStatoAsync(string idxMacchina, string valore, DateTime dtEve, string contatore, Dictionary? datiMaccCache = null);
///
/// Restituisce l'elenco completo delle configurazioni da DB, con cache Fusion
///
/// Lista di modelli ConfigModel
Task> ConfigGetAllAsync();
///
/// Restituisce l'elenco delle decodifiche articoli filtrata per codice, con cache Fusion
///
/// codice articolo (opzionale, se vuoto restituisce tutto)
/// Lista di modelli DecNumArticoliModel
Task> DecNumArtGetFiltAsync(string codArt = "");
///
/// Restituisce le date dei dossier per una macchina, con cache Fusion
///
/// idx macchina
/// Lista di modelli DossierModel
Task> DossierLastByMachAsync(string idxMacchina);
///
/// Task completo per sistemazione dossier quotidiani mancanti
///
/// idx macchina
/// "OK" se completato
Task FixDailyDossierAsync(string idxMacc);
///
/// Restituisce il codice valOut dell'ODL corrente (con cache redis interna)
///
/// idx macchina
/// codice valOut dell'ODL corrente
Task GetCurrOdlAsync(string idxMacchina);
///
/// Restituisce il modello dell'ultimo ODL per macchina, con cache Fusion
///
/// idx macchina
/// Modello ODLExpModel
Task GetLastOdlAsync(string idxMacchina);
///
/// Effettua il calcolo della data-ora di riferimento per il server, correggendo il delta
/// tra orologio macchina e server
///
/// data-oras dell'evento (macchina)
/// data-ora corrente (server)
/// Data-ora evento corretta
DateTime GetSrvDtEvent(string dtEve, string dtCurr);
///
/// Restituisce se la macchina sia abilitata all'inserimento dati da IOB
///
/// idx macchina
/// true se abilitato all'input
Task IobInsEnabAsync(string idxMacchina);
///
/// Restituisce se la macchina sia abilitata come master di un impianto
///
/// idx macchina
/// true se \u00e8 master
Task IobIsMasterAsync(string idxMacchina);
///
/// Restituisce se la macchina sia abilitata all'inserimento nel Signal Log
///
/// idx macchina
/// true se abilitato
Task IobSLogEnabAsync(string idxMacchina);
///
/// Restituisce i valori ammessi per una tabella/colonna (con cache redis interna)
///
/// nome tabella
/// nome campo
/// Lista di ListValuesModel
Task> ListValuesFilt(string tabName, string fieldName);
///
/// Restituisce l'elenco completo delle relazioni macchine master-slave, con cache Fusion
///
/// Lista di Macchine2SlaveModel
Task> Macchine2SlaveGetAllAsync();
///
/// Restituisce le macchine filtrate per gruppo, con cache Fusion
///
/// codice gruppo (o "*" per tutto)
/// Lista di MacchineModel
Task> MacchineGetFilt(string codGruppo);
///
/// Restituisce il path delle ricette di una macchina, con cache Fusion
///
/// idx macchina
/// Path delle ricette
Task MacchineRecipeArchive(string idxMacchina);
///
/// Restituisce la lista parametri correnti (ObjItemDTO) della macchina da Redis
///
/// idx macchina
/// Lista di ObjItemDTO
Task> MachineParamListAsync(string idxMacchina);
///
/// Restituisce i parametri correnti della macchina che necessitano di write (writable + reqValue valorizzato)
///
/// idx macchina
/// Lista di ObjItemDTO
Task> MachineParamListPendingWriteAsync(string idxMacchina);
///
/// Imposta i parametri correnti (ObjItemDTO) nella cache Redis della macchina
///
/// idx macchina
/// dati parametri da impostare
/// true se salvato
Task MachineParamListSetAsync(string idxMacchina, List currData);
///
/// Effettua l'UPSERT degli elementi dei parametri macchina in Redis
///
/// idx macchina
/// nuovi elementi da aggiungere/aggiornare
/// true se completato
Task MachineParamUpsertAsync(string idxMacchina, List innovations);
///
/// Restituisce i campi DatiMacchine + StatoMacchine come dizionario (da Redis o DB)
///
/// idx macchina
/// Dizionario KVP dei campi macchina
Task> mDatiMacchineAsync(string idxMacchina);
///
/// Restituisce i parametri ottimizzati per la macchine (Redis hash sync)
///
/// idx macchina
/// Dizionario KVP parametri
Dictionary mOptParMacchina(string idxMacchina);
///
/// Restituisce i task salvati della macchina (Redis hash sync)
///
/// idx macchina
/// Dizionario KVP dei task salvati
Dictionary mSavedTaskMacchina(string idxMacchina);
///
/// Restituisce l'elenco dalla tabella MappaStatoExpl, con o senza cache
///
/// se true forza lettura database senza cache
/// Lista di MappaStatoExplModel
Task> MseGetAllAsync(bool forceDb = false);
///
/// Restituisce il dizionario KVP della tabella Multi State Machine Ingressi (da Redis)
///
/// idx macchina
/// Array di KeyValuePair
Task[]> mTabMSMIAsync(string idxMacchina);
///
/// Restituisce i task in esecuzione per la macchina (Redis hash sync)
///
/// idx macchina
/// Dizionario KVP dei task
Dictionary mTaskMacchina(string idxMacchina);
///
/// Restituisce i task in esecuzione per la macchina (Redis hash async)
///
/// idx macchina
/// Dizionario KVP dei task
Task> mTaskMacchinaAsync(string idxMacchina);
///
/// Generazione automatica ODL giornalieri per la macchina
///
/// idx macchina
/// data di inizio generazione
/// data di fine generazione
/// codice articolo
/// true se generato con successo
Task OdlAutoDayGenAsync(string idxMacchina, DateTime dataInizio, DateTime dataFine, string codArticolo);
///
/// Generazione automatica ODL giornalieri completa con tutti i parametri PO/TC
///
/// idx macchina
/// data inizio
/// data fine
/// codice articolo
/// pezzi per PODL
/// pezzi per pallet
/// chiave richiesta
/// TC assegnato
/// codice gruppo
/// flag crea PODL
/// flag verifica TC
/// true se generato con successo
Task OdlAutoDayGenFullAsync(string idxMacchina, DateTime dataInizio, DateTime dataFine, string codArticolo, int? pzPODL, int? pzPallet, string? keyRichiesta, int? tcAssegnato, string? codGruppo, bool flgCreaPODL, bool flgCheckTC);
///
/// Restituisce l'ODL corrente per macchina, con cache Fusion
///
/// idx macchina
/// Modello ODLExpModel
Task OdlCurrByMaccAsync(string IdxMacchina);
///
/// Restituisce il modello PODL dato il suo indice, con cache Fusion
///
/// indice PODL
/// Modello PODLModel
Task POdlGetByKey(int idxPODL);
///
/// Restituisce i PODL per macchina/articolo, con cache Fusion
///
/// idx macchina
/// codice articolo
/// codice gruppo
/// solo PODL liberi
/// Lista di PODLExpModel
Task> POdlGetByMaccArtAsync(string idxMacchina, string codArticolo, string codGruppo, bool onlyFree);
///
/// Processa la registrazione di un flusso (FL) da IOB
///
/// idx macchina
/// codice flusso (es. Ingresso, Uscita)
/// valore valOut del flusso
/// data-ora dell'evento (macchina)
/// data-ora corrente (server)
/// contatore invio
/// se true disabilita la scrittura del keepalive
/// "OK" se completato
Task ProcessFluxLogAsync(string idxMacchina, string flux, string valore, string dtEve, string dtCurr, int contatore, bool disabKA);
///
/// Processa un input completo da IOB (verifica parametri, log segnali, processing microstato)
///
/// idx macchina
/// valore valOut
/// data-ora evento (macchina)
/// data-ora corrente (server)
/// contatore
/// "OK" se completato, error message in caso contrario
Task ProcessInputAsync(string idxMacchina, string valore, string dtEve, string dtCurr, string contatore);
///
/// Processa un UserLog registrato da IOB (DI=dichiarazioni, RC=controlli, RS=scarti)
///
/// idx macchina
/// tipo flusso: DI (Dichiarazione), RC (Controllo), RS (Scarto)
/// valore/testo
/// data-ora evento
/// data-ora corrente
/// contatore invio dati
/// matricola operatore
/// causale scarto o tagCode
/// esitoOk (0/1) o quantit\u00e0 scarto
/// "OK" se completato
Task ProcessUserLogAsync(string idxMacchina, string flux, string valore, string dtEve, string dtCurr, int contatore, int matrOpr, string label, int valNum);
///
/// Restituisce il contapezzi salvato in Redis per la macchina
///
/// idx macchina
/// Contatore pezzi (-1 se non trovato)
Task pzCounter(string idxMacchina);
///
/// Restituisce il contapezzi come conteggio da TCRilevati (dal DB)
///
/// idx macchina
/// Conteggio pezzi (-1 se non trovato)
Task PzCounterTcAsync(string idxMacchina);
///
/// Ricerca la ricetta su MongoDB dato l'indice del PODL
///
/// indice PODL di riferimento
/// Modello ricetta o null
Task RecipeGetByPODL(int idxPODL);
///
/// Effettua il conteggio delle chiavi Redis che corrispondono a un pattern
///
/// pattern di ricerca
/// Numero di chiavi trovate
int RedisCountKey(string keyPattern);
///
/// Elimina una chiave dalla memoria Redis
///
/// chiave da eliminare
/// true se eliminata
bool RedisDelKey(string keyVal);
///
/// Elimina una chiave dalla memoria Redis (async)
///
/// chiave da eliminare
/// true se eliminata
Task RedisDelKeyAsync(RedisKey keyVal);
///
/// Esegue il flush di tutte le chiavi Redis che corrispondono a un pattern
///
/// pattern di ricerca
/// true se completato
Task RedisFlushPatternAsync(RedisValue pattern);
///
/// Leggo un hash Redis come array di KeyValuePair (sync)
///
/// chiave Redis
/// Array di KeyValuePair
KeyValuePair[] RedisGetHash(RedisKey redKey);
///
/// Leggo un hash Redis come array di KeyValuePair (async)
///
/// chiave Redis
/// Array di KeyValuePair
Task[]> RedisGetHashAsync(RedisKey redKey);
///
/// Leggo un hash Redis come dizionario (sync)
///
/// chiave Redis
/// Dizionario KVP
Dictionary RedisGetHashDict(RedisKey hashKey);
///
/// Leggo un hash Redis come dizionario (async)
///
/// chiave Redis
/// Dizionario KVP
Task> RedisGetHashDictAsync(RedisKey hashKey);
///
/// Leggo un singolo campo di un hash Redis (async)
///
/// chiave Redis
/// nome campo hash
/// Valore del campo
Task RedisGetHashFieldAsync(RedisKey key, string hashField);
///
/// Verifica se una chiave esista in Redis (sync)
///
/// chiave Redis
/// true se la chiave esiste
bool RedisKeyPresent(RedisKey key);
///
/// Verifica se una chiave esista in Redis (async)
///
/// chiave Redis
/// true se la chiave esiste
Task RedisKeyPresentAsync(RedisKey key);
///
/// Imposta un hash Redis con expiration opzionale (sync)
///
/// chiave Redis
/// array di coppie chiave-valore da inserire
/// TTL in secondi (-1 = nessuna expiration)
void RedisSetHash(RedisKey redKey, KeyValuePair[] valori, double expireSeconds = -1.0);
///
/// Imposta un hash Redis con expiration opzionale (async)
///
/// chiave Redis
/// array di coppie chiave-valore da inserire
/// TTL in secondi (-1 = nessuna expiration)
Task RedisSetHashAsync(RedisKey redKey, KeyValuePair[] valori, double expireSeconds = -1.0);
///
/// Imposta un hash Redis con expiration opzionale (sync) da dizionario
///
/// chiave Redis
/// dizionario di coppie chiave-valore da inserire
/// TTL in secondi (-1 = nessuna expiration)
void RedisSetHashDict(RedisKey redKey, Dictionary valori, double expireSeconds = -1.0);
///
/// Imposta un hash Redis con expiration opzionale (async) da dizionario
///
/// chiave Redis
/// dizionario di coppie chiave-valore da inserire
/// TTL in secondi (-1 = nessuna expiration)
Task RedisSetHashDictAsync(RedisKey redKey, Dictionary valori, double expireSeconds = -1.0);
///
/// Inserimento record RemoteRebootLog con eventuale pulizia dei record vecchi
///
/// record da inserire
/// true se completato
Task RemRebootLogAddAsync(RemoteRebootLogModel newRec);
///
/// Elimina un task da elenco Redis per l'impianto indicato
///
/// idx macchina
/// nome task da eliminare
/// Dizionario KVP rimanente
Task> RemTask2ExeMacchinaAsync(string idxMacchina, taskType tName);
///
/// Resetta la tabella Multi State Machine Ingressi per macchina rileggendola dal DB
///
/// idx macchina
/// Array di KVP della State Machine Ingressi
Task[]> resetMSMIAsync(string idxMacchina);
///
/// Registra la movimentazione di un carico pezzi su Redis
///
/// idx macchina
/// quantit\u00e0 da registrare
/// "OK" se completato
Task saveCaricoPezzi(string idxMacchina, string qty);
///
/// Salva un elenco di dati macchina in DB
///
/// identificativo della serie dati
/// elenco di dati macchina da salvare
/// true se salvato
Task SaveDataItemsAsync(string id, List dataList);
///
/// Salva i dati macchina-IOB (serializzazione JSON) su Redis
///
/// idx macchina
/// dati JSON serializzati
/// true se salvato
Task SaveMachine2Iob(string idxMacchina, string serData);
///
/// Salva la configurazione della macchina come dizionario su Redis
///
/// idx macchina
/// dizionario di configurazione
/// true se salvato
Task SaveMachineIobConf(string idxMacchina, Dictionary currDict);
///
/// Salva il segnale di "microstato" come record SignalLog su DB (async)
///
/// idx macchina
/// valOut ingresso
/// data-ora evento (server)
/// contatore sequenza dati inviati
/// true se salvato
Task saveSigLogAsync(string idxMacchina, string valore, DateTime dtEve, int contatore);
///
/// Scrive un evento di keepalive se non presente in Redis con TTL
///
/// idx macchina
/// ora macchina
Task ScriviKeepAliveAsync(string IdxMacchina, DateTime oraMacchina);
///
/// Salva la configurazione YAML completa dell'IOB su Redis
///
/// idx macchina
/// configurazione YAML completa
/// true se salvata
Task SetIobConfYamlAsync(string idxMacchina, string iobConfFull);
///
/// Salva la mappatura memoria PLC su Redis
///
/// idx macchina
/// mappatura PLC da salvare
/// true se salvata
Task SetIobMemMap(string idxMacchina, PlcMemMapDto currMap);
///
/// Restituisce la tabella key-value della State Machine Ingressi per famiglia,
/// rileggendola dal DB e salvandola in Redis
///
/// idx famiglia ingressi
/// Array di KVP (currentMicroStato_nVal -> IdxTipoEv_nStato)
Task[]> StateMachInByKeyAsync(int idxFamIn);
///
/// Effettua l'UPSERT degli oggetti corrente della macchina su Redis (legacy compatibilit\u00e0)
///
/// idx macchina
/// dati da aggiornare/aggiungere
/// true se completato
Task UpsertCurrObjItemsAsync(string idxMacchina, List innovations);
///
/// Restituisce il valore SPECIFICATO per la state machine ingressi in formato hash Redis
///
/// idx famiglia ingressi
/// idx microstato
/// valore ingresso
/// valore (IdxFamIn_nValore) dalla tab SMI Redis
Task ValoreSmiAsync(int idxFamIn, int idxMicroStato, int valoreIn);
#endregion Public Methods
}
}