using System;
using System.Collections.Generic;
using System.Text;
using Consulenza.WebTemplateModeler;
using Consulenza.WebTemplateModeler.Entity;
using Newtonsoft.Json;

namespace Consulenza.Unica.Business
{
    public class WebTemplateModelerService
    {
        private WebTemplateManager webTemplateManager = new WebTemplateManager();

        public Template TestTemplate(Template template,string metodo) {
            try
            {
                if (template.IdModello == -1)
                {
                    template = JsonConvert.DeserializeObject<Template>(getlogTempalte(template.Nome));
                }
                else
                {
                   string host =  WebTemplateManager.GetIpHost();
                    string output = JsonConvert.SerializeObject(template);
                    insertLog(template.IdModello.ToString(), template.CodicePb, template.Id.ToString(), template.IsDefault, "TestTemplate(" + host + ") ", output, metodo);
                }
            }
            catch { }
            return template; 
        
        }
        

        public List<Modello> GetModelli()
        {
            List<Modello> modelli = new List<Modello>();
            try
            {
                modelli = webTemplateManager.GetModelli();
            }
            catch (Exception ex)
            {
                modelli = new List<Modello>();
                insertLog("", "", "", "", "GetModelli()", ex);

            }
            return modelli;
        }

        public Modello GetModello(int idModello)
        {
            Modello modello = new Modello();
            try
            {
                modello = webTemplateManager.GetModello(idModello);

            }
            catch (Exception ex)
            {
                modello = new Modello();
                insertLog(idModello.ToString(), "", "", "", "GetModello(...)", ex);
            }
            return modello;
        }

        public Modello GetModello(int idModello, string codicePb)
        {
            Modello modello = new Modello();
            try
            {
                modello = webTemplateManager.GetModello(idModello, codicePb);
            }
            catch (Exception ex)
            {
                modello = new Modello();
                insertLog(idModello.ToString(), codicePb, "", "", "GetModello(......)", ex);
            }
            return modello;
        }

        public List<Vincolo> GetVincoliNoChiave(string codiceAgente, string codiceFiscale, string codiceMandato, string codiceRete, long proposta, string modello)
        {
            List<Vincolo> options = new List<Vincolo>();
            try
            {
                options = webTemplateManager.GetVincoliNoChiave(codiceAgente, codiceFiscale, codiceMandato, codiceRete, proposta, modello);
            }
            catch (Exception ex)
            {

                insertLog("", "", "", "", "getVincoliNoChiave(......)", ex);
            }
            return options;
        }

        public List<Vincolo> GetVincoli(long chiave,long proposta, string modello)
        {
            List<Vincolo> options = new List<Vincolo>();
            try
            {
                options = webTemplateManager.GetVincoli(chiave,proposta, modello);
            }
            catch (Exception ex)
            {
                
                insertLog("", "", "", "", "GetVincoli(......)", ex);
            }
            return options;
        }


        public List<Template> GetTemplates(int idModello, string codicePb)
        {
            List<Template> templates = new List<Template>();
            try
            {
                templates = webTemplateManager.GetTemplates(idModello, codicePb);
            }
            catch (Exception ex)
            {
                templates = new List<Template>();
                insertLog(idModello.ToString(), codicePb, "", "", "GetTemplates(...)", ex);
            }
            return templates;
        }

        public Template GetTemplate(int idTemplate, string isDefault)
        {
            Template template = new Template();
            try
            {
                template = webTemplateManager.GetTemplate(idTemplate, isDefault);
            }
            catch (Exception ex)
            {
                template = new Template();
                insertLog("", "", idTemplate.ToString(), isDefault, "GetTemplate(...)", ex);
            }
            return template;

        }

        public List<SchedaTemplate> GetSchedeTemplate(int idTemplate, string isDefault)
        {
            List<SchedaTemplate> schedaTemplate = new List<SchedaTemplate>();
            try
            {
                schedaTemplate = webTemplateManager.GetSchedeTemplate(idTemplate, isDefault);
            }
            catch (Exception ex)
            {
                schedaTemplate = new List<SchedaTemplate>();
                insertLog("", "", idTemplate.ToString(), isDefault, "GetSchedeTemplate(...)", ex);
            }
            return schedaTemplate;

        }

        public int SetTemplate(int idModello, string codicePB, string nomeTemplate, List<Option> opzTemplate, List<SchedaTemplate> schede)
        {
            int idTemplate = -1;
            try
            {
                idTemplate = webTemplateManager.SetTemplate(nomeTemplate, codicePB, idModello, opzTemplate, schede);
            }
            catch (Exception ex)
            {
                idTemplate = -1;
                insertLog(idModello.ToString(), codicePB, "", "", "SetTemplate(...)", ex);
            }
            return idTemplate;
        }

        public int DelTemplate(int idTemplate)
        {
            int err = -1;
            try
            {
                err = webTemplateManager.DelTemplate(idTemplate);
            }
            catch (Exception ex)
            {
                err = -1;
                insertLog("", "", idTemplate.ToString(), "", "DelTemplate(...)", ex);
            }
            return err;
        }

        public void insertLog(string idModello, string codicePb, string idTemplate, string isDefault, string metodo, string message, List<DateTime> dateTime)
        {
            TimeSpan span1 = dateTime[3].Subtract(dateTime[0]);
            TimeSpan span2 = dateTime[2].Subtract(dateTime[1]);
            insertLog(
                idModello, 
                codicePb, 
                idTemplate, 
                isDefault, 
                metodo, 
                message, 
                "tempo di elaborazione " + span1.Hours + ":" + span1.Minutes + ":" + span1.Seconds + " secondi di cui di chiamata a ReportManagerWS " + span2.Hours + ":" + span2.Minutes + ":" + span2.Seconds + " secondi "
                );
        }
        public void insertLog(string idModello, string codicePb, string idTemplate, string isDefault, string metodo, string message, string stackTrace)
        {
            try
            {
                List<Parametro> param = new List<Parametro>();
                param.Add(new Parametro { Value = idModello, ParameterName = "idModello" });
                param.Add(new Parametro { Value = codicePb, ParameterName = "codicePb" });
                param.Add(new Parametro { Value = idTemplate, ParameterName = "idTemplate" });
                param.Add(new Parametro { Value = isDefault, ParameterName = "isDefault" });
                param.Add(new Parametro { Value = metodo, ParameterName = "metodo" });
                param.Add(new Parametro { Value = message, ParameterName = "message" });
                param.Add(new Parametro { Value = stackTrace, ParameterName = "stackTrace" });
                DataAccess.ExecuteNonQueryStoredProcedure(DBProvider.SqlServerWebTemplateReportModeler, "INSERTERROR", param);
            }
            catch { }
        }
        public void insertLog(string idModello, string codicePb, string idTemplate, string isDefault, string metodo, Exception exception)
        {
            if (exception is DataBaseException)
                insertLog(idModello, codicePb, idTemplate, isDefault, metodo,  ((DataBaseException)exception).Eccezione.Message, ((DataBaseException)exception).Eccezione.StackTrace);
            else
                insertLog(idModello, codicePb, idTemplate, isDefault, metodo,  exception.Message,exception.StackTrace);
        }
        private string getlogTempalte(string nome)
        {
            string template = ""; 
            try
            {
                List<Parametro> param = new List<Parametro>();                
                param.Add(new Parametro { Value = nome, ParameterName = "nome" });              
                System.Data.DataTable dt =  DataAccess.ExecuteDataTableStoredProcedure(DBProvider.SqlServerWebTemplateReportModeler, "GETTEMPLTELOG", param);
                template = dt.Rows[0][0].ToString();
            }
            catch { }
            return template;
        }

       
    }
}
