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>
    /// Dati espliciti relativi al device di riferimento
    /// </summary>
    public class DeviceDto
    {
        /// <summary>
        /// Costruttore
        /// </summary>
        public string Vendor { get; set; } = "ACME";

        /// <summary>
        /// Codice modello
        /// </summary>
        public string Model { get; set; } = "NONE";

        /// <summary>
        /// Indica se sia multi pallet
        /// </summary>
        public bool IsMulti { get; set; } = 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>
        /// Dati configurazione CNC
        /// </summary>
        public ConnectionDto Connect { get; set; } = new ConnectionDto();

        /// <summary>
        /// Indica che sono disabilitati i Task2Exe (tipicamente gestione scrittura verso PLC)
        /// </summary>
        public bool DisabExeTask { get; set; } = false;

        /// <summary>
        /// Disabilitazione ping al Device
        /// </summary>
        public bool DisabPing { get; set; } = false;

        /// <summary>
        /// Disabilitazione SignalIn dal Device
        /// </summary>
        public bool DisabSigIn { get; set; } = false;

        /// <summary>
        /// Indica che sono disabilitati i resend alla scadenza del periodo di controllo anche in mancanza di variazione (tipicametne x gli adapter secondari come PING)
        /// </summary>
        public bool DisabResendScaduto { get; set; } = false;

        /// <summary>
        /// Indica che sono disabilitate le fasi controllo stato/semafori (tipicamente x impianti
        /// con PLC "suddivisi", PLC + HMI)
        /// </summary>
        public bool DisabStateCh { get; set; } = false;

        /// <summary>
        /// Abilita riscrittura memoria se trova differenze lettura/richiesti
        /// </summary>
        public bool EnabMemRewrite { get; set; } = true;

        /// <summary>
        /// Disabilitazione controlli dipendenti da check su exe mode (es Cimolai)
        /// </summary>
        public bool ExeModeCheckBypass { get; set; } = false;

        /// <summary>
        /// Abilitazione gestione contatori
        /// </summary>
        public bool EnabPzCount { get; set; } = true;

        /// <summary>
        /// Indica se si voglia recuperare il PROG NAME dal CNC
        /// </summary>
        public bool EnabProgName { get; set; } = false;

        /// <summary>
        /// Tempo minimo di refresh ammesso (es: per current da MTConnect)
        /// </summary>
        public int MinRefreshPeriodSec { get; set; } = 20;

        /// <summary>
        /// Tempo minimo ammissibile di risposta (es x errori ModBus che risponde troppo in fretta) in millisec
        /// </summary>
        public int MinRespTimeMs { get; set; } = 5;

        /// <summary>
        /// Indica se usare la parte numerica di un articolo come codice INT
        /// </summary>
        public bool NumArtCharTrim { get; set; } = false;

        /// <summary>
        /// Conf x scritttura NumArticolo
        /// </summary>
        public string NumArtMode { get; set; } = "";

        /// <summary>
        /// Conf x scritttura NumOdl
        /// </summary>
        public string NumOdlMode { get; set; } = "";

        /// <summary>
        /// Timeout in sec x dichiarare Poweroff (tipicamente IOB PING)
        /// </summary>
        public int PoweroffTimeOutSec { get; set; } = 100;

        /// <summary>
        /// Modalità gestione lettura cadenza
        /// </summary>
        public string PzCadMode { get; set; } = "";

        /// <summary>
        /// Delay prima di iniziare a gestire il contapezzi, per evitare falsi zeri in inizializzazione sw
        /// </summary>
        public int PzCountDelay { get; set; } = 2000;

        /// <summary>
        /// Modalità gestione contapezzi
        /// </summary>
        public string PzCountMode { get; set; } = "";

        /// <summary>
        /// Definizione Memoria x pezzi richiesti
        /// </summary>
        public string PzReqMode { get; set; } = "";

        /// <summary>
        /// Definizione Memoria x pezzi totali (NON ressettabile)
        /// </summary>
        public string PzTotMode { get; set; } = "";

        /// <summary>
        /// Durata in secondi del divieto accodamento segnali IN alla fase di startup
        /// </summary>
        public int StartupVetoQueueIN { get; set; } = 5;

        /// <summary>
        /// Numero massimo errori lettura prima di disconnettere
        /// </summary>
        public int ReadErrorMax { get; set; } = 10;
        
        /// <summary>
        /// Tempo attesa prima id rivalutare errori lettura
        /// </summary>
        public int ReadErrorSleepTime { get; set; } = 15000;

        /// <summary>
        /// Configurazione SigLUT con regole decodifica valori (es FANUC/Siemens con BIT0...BIT7...)
        /// </summary>
        public Dictionary<string, string> SigLUT { get; set; } = new Dictionary<string, string>();

    }
}
