using IOB_UT_NEXT.Config.Special;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace IOB_UT_NEXT.Config.Base
{
    /// <summary>
    /// Info specifiche all'IOB
    /// </summary>
    public class IobDto
    {
        /// <summary>
        /// Nome file di configurazione
        /// </summary>
        public string FileName { get; set; } = "";

        /// <summary>
        /// Filename senza desinenza del tipo di file
        /// </summary>
        public string FilenameIOB
        {
            get => baseUtils.StringBeforeLastChar(FileName, '.');
        }

        /// <summary>
        /// Tipo Adapter specifico (implementazione)
        /// </summary>
        public tipoAdapter IobType { get; set; } = tipoAdapter.ND;

        /// <summary>
        /// Codice Cliente/Installazione
        /// </summary>
        public string Customer { get; set; } = "SteamWare";

        /// <summary>
        /// Cod grupo IOB x creazione PODL al volo
        /// </summary>
        public string CodGruppoIob { get; set; } = "ND-00";

        /// <summary>
        /// Codice univoco IOB
        /// </summary>
        public string CodIOB { get; set; } = "ND";

#if false
        /// <summary>
        /// Codice dei vari codici aggiuntivi IOB multi x funzioni slave (es autoOdl)
        /// </summary>
        public string MultiIobListRaw { get; set; } = "";

        /// <summary>
        /// Lista dei vari IOB multi x funzioni slave (es autoOdl)
        /// </summary>
        public List<string> MultiIobList { get; set; }

        /// <summary>
        /// Lista dei vari IOB multi x funzioni slave (es autoOdl)
        /// </summary>
        public bool IsMultiIobList { get; set; } = false; 
#endif

        /// <summary>
        /// Tempo di attesa (in minuti) x lettura contapezzi standard (default 30 sec)
        /// </summary>
        public double DelayReadPzCount { get; set; } = 0.5;

        /// <summary>
        /// Tempo di attesa (in minuti) x lettura contapezzi standard DOPO fase di setup (default 6 sec, da init 0.6 sec)
        /// </summary>
        public double DelayReadPzCountSetup { get; set; } = 0.1;

        /// <summary>
        /// Disabilitazione invio DynData di WDST (WatchDogStateTransfer)
        /// </summary>
        public bool DisabWDST { get; set; } = true;

        /// <summary>
        /// Determina se sia prevista gestione PODL (creazione/avvio/chiusura) come Soitaab
        /// </summary>
        public bool EnabelPodlManFull { get; set; } = false;

        /// <summary>
        /// Soglia massima errori prima della disconnessione automatica in check
        /// </summary>
        public int MaxErroriCheck { get; set; } = 50;

        /// <summary>
        /// Max tentativi ping permessi (default: 5)
        /// </summary>
        public int MaxPingRetry { get; set; } = 5;

        /// <summary>
        /// Valore minimo (delta) in sec x considerare variazioni info
        /// </summary>
        public int MinDeltaSec { get; set; } = 5;

        /// <summary>
        /// Tempo massimo di WatchDog dopo cui inviare un segnale x evitare C101
        /// </summary>
        public int WatchDogSec { get; set; } = 60;

        /// <summary>
        /// Periodo wathdog di default (2 sec se non specificato)
        /// </summary>
        public int WatchDogPeriod { get; set; } = 2;

        /// <summary>
        /// Abilita salvataggio coda eventi su redis (ritentiva)
        /// </summary>
        public bool EnabRedisQue { get; set; } = true;

        /// <summary>
        /// Forza esecuzione WorkLoopMachine (verso macchina PLC/CNC) in SingleThread (vs ThreadPool)
        /// </summary>
        public bool MachWLoopSingleThread { get; set; } = true;

        /// <summary>
        /// Versione software IOB
        /// </summary>
        public string RelVers { get; set; } = "0.0.0.0";

        /// <summary>
        /// Indica se resettare allarmi all'avvio e inviare il reset appena parte adapter
        /// </summary>
        public bool ResetAlarmOnStart { get; set; } = false;

        /// <summary>
        /// Abilitazione invio conf macchine
        /// </summary>
        public bool SenMachineConf { get; set; } = true;

        /// <summary>
        /// Gestione dei Timers applicazione (UI + task varia scandenza)
        /// </summary>
        public TimersDto Timers { get; set; } = new TimersDto();

        /// <summary>
        /// Tempo di attesa per tentativo reconnect in MSec, override da conf applicativo generale
        /// </summary>
        public int WaitRecMsec { get; set; } = 59000;
    }
}
