using System;
using System.Collections.Generic;
using System.Linq;
using Consulenza.WebTemplateModeler.Entity;
using System.Data;
using System.Transactions;
using System.Net;
using System.Net.Sockets;
using System.Configuration;


namespace Consulenza.WebTemplateModeler
{
    public class WebTemplateManager
    {

      
        public List<Modello> GetModelli() {
            return getModelli();
        }
        public Modello GetModello(int idModello)
        {
            return getModello(idModello);
        }
        public Modello GetModello(int idModello, string codicePB)
        {
            Modello modello = getModello(idModello);
            modello.Templates = getTemplates(idModello, codicePB);
            return modello;
        }
        public List<Vincolo> GetVincoli(long chiave,long proposta, string modello)
        {
            List<Vincolo> vincoli = getVincoli(chiave,proposta, modello);
            return vincoli;
        }

        public List<Vincolo> GetVincoliNoChiave(string codiceAgente, string codiceFiscale, string codiceMandato, string codiceRete, long proposta, string modello)
        {
            List<Vincolo> vincoli = getVincoliNoChiave(codiceAgente, codiceFiscale, codiceMandato, codiceRete, proposta, modello);
            return vincoli;
        }

        public List<Template> GetTemplates(int idModello, string codicePB)
        {
            return getTemplates(idModello, codicePB);
        }
        public Template GetTemplate(int idTemplate, string isDefault)
        {
            Template template = getTemplate(idTemplate, isDefault);
            template.Schede = getSchedeTemplate(idTemplate,isDefault);
            return template;
        }
        public List<SchedaTemplate> GetSchedeTemplate(int idTemplate, string isDefault)
        {
            return getSchedeTemplate(idTemplate, isDefault);

        }
        public int SetTemplate(string nomeTemplate, string codicePB, int idModello, List<Option> opzTemplate, List<SchedaTemplate> schede)
        {
            return setTemplate(nomeTemplate, codicePB, idModello, opzTemplate, schede);

        }
        public int DelTemplate(int idTemplate) {
            return  delTemplate(idTemplate); }

        private List<Modello> getModelli() {

            List<Parametro> param = new List<Parametro>();          
            DataTable dt = DataAccess.ExecuteDataTableStoredProcedure(DBProvider.SqlServerWebTemplateReportModeler, "SEL_MODELLO", param);

            return (from DataRow row in dt.Rows
                              select new Modello
                              {
                                  Id = int.Parse(row["idModello"].ToString()),
                                  Nome = row["nomeModello"].ToString(),
                                  Rete = row["rete"].ToString(),
                                  Options = Option.Format(row["opzModello"].ToString())

                              }).ToList<Modello>();          
        }
        private Modello getModello(int idModello)
        {
            string ipPath = GetIPPath();
            List<Parametro> param = new List<Parametro>();
            param.Add(new Parametro { Value = idModello, ParameterName = "idModello" });
            DataTable dt = DataAccess.ExecuteDataTableStoredProcedure(DBProvider.SqlServerWebTemplateReportModeler, "SEL_MODELLO", param);
            string banca = dt.Rows[0]["banca"].ToString();
            string rete = dt.Rows[0]["rete"].ToString().Trim();
            Modello modello = new Modello
            {
                Id = int.Parse(dt.Rows[0]["idModello"].ToString()),
                Nome = dt.Rows[0]["nomeModello"].ToString(),
                Rete = rete,
                Options = Option.Format(dt.Rows[0]["opzModello"].ToString().Replace("[BANCA]", banca))
            };
            modello.Schede = (from DataRow row in dt.Rows
                              select new Scheda
                              {
                                  Id = int.Parse(row["idScheda"].ToString()),
                                  NomeImmagine = ipPath + rete+ row["nomeImmagineScheda"].ToString(),
                                  NumTab = int.Parse(row["numTab"].ToString()),
                                  Sezioni = row["sezioni"].ToString(),
                                  TestoHTML = row["testoHTML"].ToString().Replace("[BANCA]", banca),
                                  Vincoli = Vincolo.Format(row["vincoli"].ToString()),
                                  Options = Option.Format(row["opzScheda"].ToString().Replace("[BANCA]", banca))

                              }).ToList<Scheda>();

            dt = DataAccess.ExecuteDataTableSqlStatement(DBProvider.SqlServerWebTemplateReportModeler, "SELECT * FROM tabs where idModello = " + modello.Id + " order by numTab asc", new List<Parametro>());

            modello.Tabs = (from DataRow row in dt.Rows
                            select new Tabs
                            {
                                IdModello = int.Parse(row["idModello"].ToString()),
                                NumTab = int.Parse(row["NumTab"].ToString()),
                                Titolo = row["Titolo"].ToString().Replace("[BANCA]", banca)
                            }).ToList<Tabs>();

            filtraSchede(modello.Schede);


            return modello;
        }
        public List<Vincolo> getVincoli(long chiave,long proposta, string modello)
        {
            List<Vincolo> vincoli = new List<Vincolo>();
            try
            { 
                List<Parametro> param = new List<Parametro>();
                param.Add(new Parametro { Value = chiave, ParameterName = "chiave" });
                DataTable dt = DataAccess.ExecuteDataTableStoredProcedure(DBProvider.SqlServerConsulenzaUnica, "rep_vincoli_" + modello, param);
                foreach (DataColumn dc in dt.Columns)
                {
                    vincoli.Add(new Vincolo
                    {
                        Key = dc.ColumnName,
                        Value = dt.Rows[0][dc.ColumnName].ToString()
                    });
                }
            }
            catch (Exception ex) { 
            }
            return vincoli;
             
        }

        public List<Vincolo> getVincoliNoChiave(string codiceAgente, string codiceFiscale, string codiceMandato, string codiceRete, long proposta, string modello)
        {
            List<Vincolo> vincoli = new List<Vincolo>();
            try
            {
                string querySQL = "SELECT * FROM vInfoCliente WHERE codFis = '" + codiceFiscale + "' AND codMan='" + codiceMandato + "' AND Agente = '" + codiceAgente + "' AND rete = '" + codiceRete + "'";
                var dtChiave = DataAccess.ExecuteDataTableSqlStatement(DBProvider.SqlServerConsulenzaUnica, querySQL, null);
                if (dtChiave.Rows.Count == 0)
                {
                    querySQL = "SELECT * FROM vInfoCliente WHERE pIva = '" + codiceFiscale + "' AND codMan='" + codiceMandato + "' AND Agente = '" + codiceAgente + "' AND rete = '" + codiceRete + "'";
                    dtChiave = DataAccess.ExecuteDataTableSqlStatement(DBProvider.SqlServerConsulenzaUnica, querySQL, null);
                }
                
                var chiave = dtChiave.Rows[0]["chiaveclientePb"].ToString();

                List<Parametro> param = new List<Parametro>();
                param.Add(new Parametro { Value = chiave, ParameterName = "chiave" });
                DataTable dt = DataAccess.ExecuteDataTableStoredProcedure(DBProvider.SqlServerConsulenzaUnica, "rep_vincoli_" + modello, param);
                foreach (DataColumn dc in dt.Columns)
                {
                    vincoli.Add(new Vincolo
                    {
                        Key = dc.ColumnName,
                        Value = dt.Rows[0][dc.ColumnName].ToString()
                    });
                }
            }
            catch (Exception ex)
            {
            }
            return vincoli;
        }

        private List<Template> getTemplates(int idModello, string codicePB)
        {
            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 = 0, ParameterName = "idTemplate" });
            param.Add(new Parametro { Value = "", ParameterName = "isDefault" });
            DataTable dt = DataAccess.ExecuteDataTableStoredProcedure(DBProvider.SqlServerWebTemplateReportModeler, "SEL_TEMPLATE", param);
            return (from DataRow row in dt.Rows
                    select new Template
                    {
                        Id = int.Parse(row["idTemplate"].ToString()),
                        Nome = row["nomeTemplate"].ToString(),
                        CodicePb = row["codicePB"].ToString(),
                        IsDefault = row["Default"].ToString(),
                        IdModello = int.Parse(row["idModello"].ToString()),
                        Options = Option.Format(row["opzioni"].ToString())

                    }).ToList<Template>();
        }
        private Template getTemplate(int idTemplate, string isDefault)
        {
            List<Parametro> param = new List<Parametro>();
            param.Add(new Parametro { Value = "", ParameterName = "idModello" });
            param.Add(new Parametro { Value = "", ParameterName = "codicePB" });
            param.Add(new Parametro { Value = idTemplate, ParameterName = "idTemplate" });
            param.Add(new Parametro { Value = isDefault, ParameterName = "isDefault" });
            DataTable dt = DataAccess.ExecuteDataTableStoredProcedure(DBProvider.SqlServerWebTemplateReportModeler, "SEL_TEMPLATE", param);
            return (from DataRow row in dt.Rows
                    select new Template
                    {
                        Id = int.Parse(row["idTemplate"].ToString()),
                        Nome = row["nomeTemplate"].ToString(),
                        CodicePb = row["codicePB"].ToString(),
                        IsDefault = row["Default"].ToString(),
                        IdModello = int.Parse(row["idModello"].ToString()),
                        Options = Option.Format(row["opzioni"].ToString())

                    }).Last<Template>();
        }
        private List<SchedaTemplate> getSchedeTemplate(int idTemplate, string isDefault)
        {
            List<Parametro> param = new List<Parametro>();
            param.Add(new Parametro { Value = idTemplate, ParameterName = "idTemplate" });
            param.Add(new Parametro { Value = isDefault, ParameterName = "default" });
            DataTable dt = DataAccess.ExecuteDataTableStoredProcedure(DBProvider.SqlServerWebTemplateReportModeler, "SEL_SCHEDETEMPLATE", param);
            return (from DataRow row in dt.Rows
                    select new SchedaTemplate
                    {
                        Id = int.Parse(row["idSchede"].ToString()),
                        Options = Option.Format(row["opzioni"].ToString())

                    }).ToList<SchedaTemplate>();



        }
        private int setTemplate(string nomeTemplate, string codicePB, int idModello, List<Option> Options, List<SchedaTemplate> schede)
        {
            using (TransactionScope scope = new TransactionScope())
            {
                List<Parametro> pTemplate = new List<Parametro>();
                pTemplate.Add(new Parametro { Value = nomeTemplate, ParameterName = "nomeTemplate" });
                pTemplate.Add(new Parametro { Value = codicePB, ParameterName = "codicePB" });
                pTemplate.Add(new Parametro { Value = idModello, ParameterName = "idModello" });
                pTemplate.Add(new Parametro { Value = Option.Format(Options), ParameterName = "opzioni" });

                int IdTemplate = (Int32)DataAccess.ExecuteScalarStoredProcedure(DBProvider.SqlServerWebTemplateReportModeler, "INS_TEMPLATE", pTemplate);

                for (int i = 0; i < schede.Count; i++)
                {

                    List<Parametro> pSchedeTemplate = new List<Parametro>();
                    pSchedeTemplate.Add(new Parametro { Value = IdTemplate, ParameterName = "idTemplate" });
                    pSchedeTemplate.Add(new Parametro { Value = schede[i].Id, ParameterName = "idSchede" });
                    pSchedeTemplate.Add(new Parametro { Value = (i + 1), ParameterName = "ordine" });
                    pSchedeTemplate.Add(new Parametro { Value = Option.Format(schede[i].Options), ParameterName = "opzioni" });

                    DataAccess.ExecuteScalarStoredProcedure(DBProvider.SqlServerWebTemplateReportModeler, "INS_SCHEDETEMPLATE", pSchedeTemplate);

                }
                scope.Complete();
                return IdTemplate;
            }

        }
        private int delTemplate(int idTemplate)
        {
            List<Parametro> pTemplate = new List<Parametro>();
            pTemplate.Add(new Parametro { Value = idTemplate, ParameterName = "idTemplate" });
            DataAccess.ExecuteNonQueryStoredProcedure(DBProvider.SqlServerWebTemplateReportModeler, "DEL_TEMPLATE", pTemplate);
            return 1;
        }

        public static string GetIpHost()
        {
            string host = "???";
            try
            {
                IPAddress[] ipv4Addresses = Array.FindAll(
                Dns.GetHostEntry(string.Empty).AddressList,
                a => a.AddressFamily == AddressFamily.InterNetwork);
                host  = ipv4Addresses[0].ToString();
                switch (host) {
                    case "10.10.33.181":
                        host = "P1P2";
                        break;
                    case "10.14.152.9":
                    case "10.10.33.174":
                        host = "P1";
                        break;
                    case "10.14.152.29":
                    case "10.10.33.180":
                        host = "P2";
                        break;
                    case "10.10.33.169":
                    case "10.14.152.21":
                        host = "C";
                        break;

                    case "10.14.152.27":
                        host = "T";
                        break;

                    case "10.0.0.77":
                        host = "P2";
                        break;
                    default:
                        break;
                }


            }
            catch {
                host = "err";
            }
            return host;
          
        }
        public static string GetIPPath()
        {
            //IPAddress[] ipv4Addresses = Array.FindAll(
            //Dns.GetHostEntry(string.Empty).AddressList,
            //a => a.AddressFamily == AddressFamily.InterNetwork);
            //return "http://" + ipv4Addresses[0].ToString() + "/Consulenza.Unica.Services/imgreport/";
            return ConfigurationManager.AppSettings["UrlImageSchede"].ToString()+"/";
          
        }

        private void filtraSchede(List<Scheda> schede)
        {
            try
            {
                string[] dsezioni = ConfigurationManager.AppSettings["disableSchede"].ToString().Split(',');
                foreach (string dsezione in dsezioni)
                { 
                    foreach (Scheda scheda in schede) 
                    {
                        if (dsezione.Equals(scheda.Sezioni))
                        {
                            schede.Remove(scheda);
                            break;
                        }
                    }
                }
            }
            catch { }

        }
    }
}
