using SteamWare;
using System;

namespace GMW_data
{
    /// <summary>
    /// classe gestioen amcchina a stati
    /// </summary>
    public class StateMachine
    {
        #region area table adapters

        public DS_SMTableAdapters.TabTranPosizEventiTableAdapter taTTPE;
        public DS_SMTableAdapters.AnagTipoDelibereTableAdapter taATD;

        /// <summary>
        /// init dei table adapters
        /// </summary>
        protected void initTA()
        {
            taTTPE = new GMW_data.DS_SMTableAdapters.TabTranPosizEventiTableAdapter();
            taATD = new GMW_data.DS_SMTableAdapters.AnagTipoDelibereTableAdapter();
        }
        /// <summary>
        /// effettua setup dei connection strings da web.config delal singola applicazione
        /// </summary>
        protected virtual void setupConnectionStringBase()
        {
            // connections del db
            taTTPE.Connection.ConnectionString = memLayer.ML.confReadString("GMWConnectionString");
            taATD.Connection.ConnectionString = memLayer.ML.confReadString("GMWConnectionString");
        }

        #endregion

        protected StateMachine()
        {
            initTA();
            setupConnectionStringBase();
        }

        /// <summary>
        /// effettua la delibera dell'UDC andando a processare tramite macchina a stati l'eventuale spostamento di IdxPosizione
        /// </summary>
        /// <param name="UDC"></param>
        /// <param name="CodTipoDelibera"></param>
        /// <param name="CodEvento"></param>
        /// <param name="clientIp">IP del client</param>
        /// <returns></returns>
        public void deliberaUdc(string UDC, string CodTipoDelibera, string CodEvento, string clientIp)
        {
            bool fatto = false;
            try
            {
                // calcolo la prima cella possibile data
                utils.obj.taSTP.stp_UDC_delibera(CodTipoDelibera, UDC, CodEvento, MagClass.magazzino.CodSoggCurrUser, memLayer.ML.cdv("CodCS"));
                // dopo la delibera passo direttamente al consumo se richiesto!
                if (memLayer.ML.confReadBool("Cosumo84PostDelibera"))
                {
                    // prendo i dati PRIMA che scarichi l'UDC... e con qta negativa xché qui devo "rimetterlo a posto"...
                    DS_magazzino.ElencoCartelliniRow riga = MagClass.magazzino.taCartellini.getDetailsUdcByUdc(UDC)[0];
                    string Particolare = riga.Particolare;
                    int IdxPosizione = riga.IdxPosizione;
                    decimal Quantita = -riga.Qta;
                    // da db determino che non faccio scaricamento automatico da altre posizioni terzisti/clienti (solo 84) xché non c'è in TabTranEventi
                    fatto = MagClass.magazzino.scaricaUdcMpWip(UDC, clientIp);
                }
                logger.lg.scriviLog(string.Format(" | {0} | deliberato UDC {1} | evento {2} | tipo delibera {2}", clientIp, UDC, CodEvento, CodTipoDelibera), tipoLog.INFO);
            }
            catch (Exception e)
            {
                logger.lg.scriviLog(string.Format(" | {5} | Non sono riuscito a fare la delibera di tipo {0} per l'UDC {1} da parte dell'user {2}, messaggio d'errore {3}{4}", CodTipoDelibera, UDC, user_std.UtSn.userNameAD, Environment.NewLine, e, clientIp), SteamWare.tipoLog.ERROR);
            }
        }
        /// <summary>
        /// calcola dalla tabella di transizioni la nuova posizione associata all'evento ed alla posizione attuale
        /// </summary>
        /// <param name="CodEvento"></param>
        /// <param name="IdxPosizione"></param>
        /// <returns></returns>
        public int getIdxPostizioneTo(string CodEvento, int IdxPosizione)
        {
            int answ = 0;
            try
            {
                answ = taTTPE.getByEventoPosizione(CodEvento, IdxPosizione)[0].IdxPosizioneTo;
            }
            catch
            { }
            return answ;
        }
        /// <summary>
        /// calcola dalla tabella di transizioni il blocco di destinazione associato all'evento ed alla posizione attuale
        /// </summary>
        /// <param name="CodEvento"></param>
        /// <param name="IdxPosizione"></param>
        /// <returns></returns>
        public int getIdxBloccoTo(string CodEvento, int IdxPosizione)
        {
            int answ = 0;
            try
            {
                answ = taTTPE.getByEventoPosizione(CodEvento, IdxPosizione)[0].IdxBloccoTo;
            }
            catch
            { }
            return answ;
        }
        /// <summary>
        /// Singleton accesos a state machine
        /// </summary>
        public static StateMachine SM = new StateMachine();
    }
}
