using AppData;
using Newtonsoft.Json;
using NKC_SDK;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web.Http;

namespace NKC_WF.Controllers
{
    /// <summary>
    /// Classe controller per gestione eventi stats
    /// Riceve una lista di 1..n eventi con
    ///  * CodMacchina
    ///  * DataOra
    ///  * Codice (Evento/stato) - codice 00 = KeepAlive, imposto dataora/drift
    ///  * Valore/Descrizione
    ///
    /// e la salva su DB per successiva elaborazione
    /// </summary>
    public class MachineStatController : ApiController
    {
        #region Protected Fields

        /// <summary>
        /// oggetto static/singleton per fare chiamate sul datalayer
        /// </summary>
        protected DataLayer DLMan = new DataLayer();

        /// <summary>
        /// Codice macchina (HARD CODED)
        /// </summary>
        protected string machine = "WRK000";

        #endregion Protected Fields

        #region Public Methods

        /// <summary>
        /// Restituisce un array di stati macchina correnti
        /// GET: api/MachineStat
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public List<MachineStatData> Get()
        {
            List<MachineStatData> answ = new List<MachineStatData>();
            try
            {
                answ = ComLib.prodMachStateDataGet();
            }
            catch
            { }

            // se vuoto metto 1 finto...
            if (answ.Count == 0)
            {
                var demoItem = new MachineStatData();
                demoItem.Records.Add(new MachineStatRecord());
                answ.Add(demoItem);
            }

            return answ;
        }

        /// <summary>
        /// Fornisce il record dello stato macchina corrente
        /// GET: api/MachineStat/WRK001
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        [HttpGet]
        public MachineStatData Get(string id)
        {
            MachineStatData answ = new MachineStatData();
            try
            {
                var listState = ComLib.prodMachStateDataGet();
                if (listState != null && listState.Count > 0)
                {
                    answ = listState.Where(x => x.Machine == id).FirstOrDefault();
                }
            }
            catch
            { }

            return answ;
        }

        /************************************
         * METODI PUT
         *
         * per abilitare è necessario agire sulla conf di IIS:
         *
         * - modificare il file applicationHost.config che si trova in C:\Windows\System32\inetsrv\config
         * - disinstallare webDav oppure commentare le righe
         *  <!-- <add name="WebDAVModule" /> -->
         *  <!-- <add name="WebDAVModule" image="%windir%\System32\inetsrv\webdav.dll" /> -->
         *  <!-- <add name="WebDAV" path="*" verb="PROPFIND,PROPPATCH,MKCOL,PUT,COPY,DELETE,MOVE,LOCK,UNLOCK" modules="WebDAVModule" resourceType="Unspecified" requireAccess="None" /> -->
         * - aggiungere PUT/DELETE a handler:
         *  <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
         *  <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" responseBufferLimit="0" />
         *
         **************************************/

#if false
        /// <summary>
        /// Processa una chiamata POST per l'invio in blocco
        /// POST: api/Bunk
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public string Post()
        {
            int BunkId = 0;
            int BatchId = 0;
            string answ = "";
            // questa classe è derivata da Controller.Response... x cui recupero lo stream in altro modo...
            string content = "";
            System.Web.HttpContext.Current.Request.InputStream.Position = 0;
            using (var reader = new StreamReader(System.Web.HttpContext.Current.Request.InputStream, System.Text.Encoding.UTF8, true, 4096, true))
            {
                content = reader.ReadToEnd();
            }
            //Rest
            System.Web.HttpContext.Current.Request.InputStream.Position = 0;
            // procedo a deserializzare in blocco l'oggetto...
            try
            {
                // deserializzo.
                SheetWorkList sheetUpdated = JsonConvert.DeserializeObject<SheetWorkList>(content);
                if (sheetUpdated != null)
                {
                    // 2020.01.16 salvo su mongoDb la risposta...
                    ComLib.man.saveProdAnsw(sheetUpdated);

                    if (sheetUpdated.SheetList != null)
                    {
                        foreach (var currSheet in sheetUpdated.SheetList)
                        {
                            // se non nullo...
                            if (currSheet != null)
                            {
                                DLMan.taSHL.updateDate(currSheet.SheetId, currSheet.Printing.DtStart, currSheet.Printing.DtEnd, currSheet.Machining.DtStart, currSheet.Machining.DtEnd, currSheet.Unloading.DtStart, currSheet.Unloading.DtEnd, (int)currSheet.Status);
                                // SE machining completato --> status a LAVORATO x item!
                                if (currSheet.Machining.DtEnd != null)
                                {
                                    // hard coded su multiax
                                    DLMan.taIL.updateSheetStatus(currSheet.SheetId, 1, "WRK001");
                                }
                                // segnalo avanzamento su redis x pagina unload
                                ComLib.advaceSheetRevByBunk(currSheet.BunkId);
                                BunkId = currSheet.BunkId;
                                answ = "OK";
                            }
                        }
                    }
                    var tabBunks = DLMan.taSTL.getByKey(BunkId);
                    if (tabBunks.Count > 0)
                    {
                        BatchId = tabBunks[0].BatchID;
                    }
                    // ricalcolo stato BUNK
                    ComLib.updateBatchPosition(BatchId);
                    // INVALIDO eventuale valore BUNK in REDIS...
                    ComLib.resetRedisBunkData(machine);
                }
            }
            catch
            {
                answ = "NO";
            }
            return answ;
        }
#endif

        /// <summary>
        /// Effettua la chiamata di update x un set di dati delle macchine
        /// </summary>
        /// <param name="MSDUpdated">Oggetto con macchina + Elenco record da aggiornare</param>
        // PUT: api/Sheet/5
        [HttpPut]
        public void Put(MachineStatData updatedInfo)
        {
            // NB. decodifico direttamente come oggetto, vedere qui:
            // https://weblog.west-wind.com/posts/2013/dec/13/accepting-raw-request-body-content-with-aspnet-web-api
            // https://weblog.west-wind.com/posts/2017/sep/14/accepting-raw-request-body-content-in-aspnet-core-api-controllers

            if (updatedInfo != null)
            {
                // mi limito a chiamnare procedura di update...
                ComLib.prodMachStateDataInsert(updatedInfo);
            }
        }

        #endregion Public Methods
    }
}