using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Reflection;
using System.Data.SqlClient;
using XMLExtractor;

namespace XMLExtractor
{


    public class Chapter {

        public string id { get; set; }
        public int idCapitolo { get; set; }
        public string titoloCapitolo { get; set; }

        // Scrive Tabella capitoli e Paragrafi (vuoti)
        public void writeDB(SqlConnection conn, TemplateStrutturaModelli templateStrutturaModelli)
        {
            //  I capitoli di Immobiliare Monitoraggio su DB partono da 201
            //  I paragrafi di Immobiliare Monitoraggio su DB partono da 201
            //  I dati sono estratti dallXML con indice che parte da 1
            int rowsUpdatedInserted = 0;
            string[] stringvalue = new string[2]{ "Capitoli", "Paragrafi"};
            foreach (var value in stringvalue)
            {
                SqlCommand updInsCommand;
                SqlCommand cmdCount = new SqlCommand("SELECT count(*) from " + value + " WHERE ID = @ID", conn);
                cmdCount.Parameters.AddWithValue("@ID", Utility.CHIAVE_LAYOUT_CHAPTER + 200);
                int count = (int)cmdCount.ExecuteScalar();
                string command = ((count > 0) ? "UPDATE " : "INSERT INTO ") + value + " ";

                // Se esiste, faccio l'update, altrimenti creo una nuova riga
                if (count > 0)
                    command += "SET Descrizione = @descrizione WHERE ID = @ID";
                else
                    command += value.Equals("Capitoli") ? "(ID, Descrizione, RipetiOgniPagina) VALUES (@ID, @Descrizione, 1)" : 
                        "(ID, Nome, Descrizione) VALUES (@ID, @Nome, @Descrizione)"/*, WHERE ID = @ID"*/;

                updInsCommand = new SqlCommand(command);
                string Descrizione = "S" + Utility.CHIAVE_LAYOUT_CHAPTER + "." + this.titoloCapitolo + ".MonitoraggioImmobiliare";
                    updInsCommand.Parameters.AddWithValue("@ID", Utility.CHIAVE_LAYOUT_CHAPTER + 200);//this.idCapitolo + 200);

                    if (value.Equals("Capitoli"))
                    {
                        updInsCommand.Parameters.AddWithValue("@Descrizione", Descrizione);
                        templateStrutturaModelli.idCapitolo = Utility.CHIAVE_LAYOUT_CHAPTER + 200;//this.idCapitolo + 200;
                    }
                    else
                    {
                        updInsCommand.Parameters.AddWithValue("@Nome", Descrizione);
                        updInsCommand.Parameters.AddWithValue("@Descrizione", "ParagrafoVuoto");
                        templateStrutturaModelli.idParagrafo = Utility.CHIAVE_LAYOUT_CHAPTER + 200;//this.idCapitolo + 200;
                    }
                    updInsCommand.Connection = conn;
                    rowsUpdatedInserted = updInsCommand.ExecuteNonQuery();

                    if (rowsUpdatedInserted > 0 && value.Equals("Capitoli"))
                        writeTestiDB(conn, templateStrutturaModelli);           
            }
            Utility.CHIAVE_LAYOUT_CHAPTER++;
        }

        // Scrive in TestiCapitoli
        public void writeTestiDB(SqlConnection conn, TemplateStrutturaModelli templateStrutturaModelli)
        {
            SqlCommand updInsCommand;
            SqlCommand cmdCount = new SqlCommand("SELECT count(*) from TestiCapitoli WHERE IdCapitolo = @ID", conn);
            cmdCount.Parameters.AddWithValue("@ID", Utility.CHIAVE_LAYOUT_CHAPTER + 200);//this.idCapitolo + 200);
            int count = (int)cmdCount.ExecuteScalar();

            // Se esiste, faccio l'update, altrimenti creo una nuova riga
            if (count > 0)
            {
                // UPDATE STATEMENT
                updInsCommand = new SqlCommand("UPDATE TestiCapitoli SET ID = @ID, IdReport = 11, idCapitolo = @idCapitolo, Testo1 = @testo1 WHERE IdCapitolo = " + this.idCapitolo + 124, conn);
            }
            else
            {
                // INSERT STATEMENT
                updInsCommand = new SqlCommand("INSERT into TestiCapitoli (ID, IdReport, idCapitolo, Testo1) VALUES (@ID, 11, @idCapitolo, @testo1)", conn);
            }

            // ID Report = 11 => 'Immobiliare Monitoraggio'
            updInsCommand.Parameters.AddWithValue("@ID", Convert.ToInt32(new SqlCommand("SELECT MAX(ID) FROM TestiCapitoli", conn).ExecuteScalar()) + 1);
            updInsCommand.Parameters.AddWithValue("@idCapitolo", Utility.CHIAVE_LAYOUT_CHAPTER + 200);//this.idCapitolo + 200);
            updInsCommand.Parameters.AddWithValue("@testo1", this.titoloCapitolo);
            int rowsUpdatedInserted = updInsCommand.ExecuteNonQuery();
            if (rowsUpdatedInserted > 0)
                writeChiaveLayoutDB(conn, templateStrutturaModelli);
        }

        // Scrive in ClassiLayout le chiavi layout dei Capitoli
        public void writeChiaveLayoutDB(SqlConnection conn, TemplateStrutturaModelli templateStrutturaModelli)
        {
            SqlCommand updInsCommand;
            SqlCommand cmdCount = new SqlCommand("SELECT count(*) from ClassiLayout WHERE IdChiaveLayout = @idChiaveLayout", conn);
            cmdCount.Parameters.AddWithValue("@idChiaveLayout", Utility.CHIAVE_LAYOUT_CHAPTER + 3000);//this.idCapitolo + 3000);
            updInsCommand = new SqlCommand("INSERT into ClassiLayout (IdChiaveLayout, Classe, Namespace, Descrizione) VALUES (@idChiaveLayout, "
                + "@classe, @NameSpace, @Descrizione)", conn);

            if (!this.titoloCapitolo.Contains("Indice"))
            {
                updInsCommand.Parameters.AddWithValue("@IdChiaveLayout", Utility.CHIAVE_LAYOUT_CHAPTER + 3000);//this.idCapitolo + 3000);
                updInsCommand.Parameters.AddWithValue("@classe", "S" + Utility.CHIAVE_LAYOUT_CHAPTER);//this.idCapitolo);
                updInsCommand.Parameters.AddWithValue("@NameSpace", "Consulenza.ReportWriter.Manager.Chapter.Immobiliare.Monitoraggio");
                updInsCommand.Parameters.AddWithValue("@Descrizione", "S" + Utility.CHIAVE_LAYOUT_CHAPTER + "." + this.titoloCapitolo + " - Immobiliare Monitoraggio");
            }
            else
            {
                updInsCommand.Parameters.AddWithValue("@IdChiaveLayout", Utility.CHIAVE_LAYOUT_CHAPTER + 3000);//this.idCapitolo + 3000);
                updInsCommand.Parameters.AddWithValue("@classe", "S" + this.idCapitolo);//this.idCapitolo);
                updInsCommand.Parameters.AddWithValue("@NameSpace", "Consulenza.ReportWriter.Manager.Chapter.Immobiliare.Monitoraggio");
                updInsCommand.Parameters.AddWithValue("@Descrizione", "S" + this.idCapitolo + "." + this.titoloCapitolo + " - Immobiliare Monitoraggio");
            }

            templateStrutturaModelli.capitoloChiaveLayout = Utility.CHIAVE_LAYOUT_CHAPTER + 3000;////this.idCapitolo + 3000;
            int rowsUpdatedInserted = updInsCommand.ExecuteNonQuery();
        }


        public List<string> getProperties()
        {
            List<string> properties = new List<string>();
            ChartMediaDeiPrezzi objectChart = new ChartMediaDeiPrezzi();
            foreach (var prop in objectChart.GetType().GetProperties())
            {
                properties.Add(prop.Name.ToLower());
            }

            properties.Remove("idcapitolo");
            return properties;
        }

        public static void writeChapter(XmlNode attribute, List<string> tagList, string nextTag, Data data)
        {
            Chapter chapter = new Chapter();
            foreach (XmlNode attr in attribute.ChildNodes) 
                if (!tagList.Contains(attr.Name.ToString())) {
                    PropertyInfo propertyInfo = chapter.GetType().GetProperty(attr.Name);
                    propertyInfo.SetValue(chapter, Convert.ChangeType(attr.InnerText, propertyInfo.PropertyType), null);
                }
                else
                    ReadXML.extractTag(attr, nextTag);

             chapter.idCapitolo = ReadXML.idCapitolo;
             data.chapterList.Add(chapter);
             chapter = new Chapter();
             ReadXML.idCapitolo++;
        }
        
    }
}
