using ClosedXML.Excel;
using DevExpress.Export;
using DevExpress.Web;
using DevExpress.XtraPrinting;
using MySqlConnector;
using System;
using System.Collections.Generic;
using System.Data;
using System.Drawing;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using LumenWorks.Framework.IO.Csv;

namespace OlympiaIntranet
{
    public partial class Reconciliator : System.Web.UI.Page
    {
        protected override void InitializeCulture() // Aggiunto altrimenti in produzione prendeva settaggi USA per i decimali con il punto invece che con la virgola
        {
            Culture = "it-IT";
            UICulture = "it";

        }
        protected void Page_Load(object sender, EventArgs e)
        {
            if (HttpContext.Current.User.Identity.IsAuthenticated == false)
            {
                Response.Redirect("~/SignIn.aspx");
            }

        }

        protected void uploadControl_FileUploadComplete(object sender, DevExpress.Web.FileUploadCompleteEventArgs e)
        {
            // ref: https://docs.devexpress.com/AspNet/16891/components/file-management/file-upload/concepts/page-life-cycle-during-file-upload
            // nota: ho dovuto settare uploadControl.FileUploadMode = OnPageLoad altrimenti non veniva letto il selectedindex di rblBanca 
            //       perchè non ancora creato in quanto il page life cycle è modificato in caso di upload

            if (rblBanca.SelectedIndex == 0) Session["dtInputFile"] = ElaboraCSVBancaSella(e.UploadedFile);

            if (rblBanca.SelectedIndex == 1) Session["dtInputFile"] = ElaboraCSVUBS(e.UploadedFile); // da implementare!
        }

        public DataTable ElaboraCSVUBS(UploadedFile uploadedFile)
        {
            // ref link: https://www.codeproject.com/Articles/9258/A-Fast-CSV-Reader
            DataTable dtCsv = new DataTable();
            DataTable dtTransazioniGDN = new DataTable();
            Char quotingCharacter = '\0';  // means none
            Char escapeCharacter = '\0';
            Char commentCharacter = '\0';
            Char delimiter = ';';
            bool hasHeader = true;
            if (uploadedFile.IsValid)
            {

                using (CsvReader csv = new CsvReader(new StreamReader(uploadedFile.FileContent), hasHeader, delimiter, quotingCharacter, escapeCharacter, commentCharacter, ValueTrimmingOptions.UnquotedOnly))
                {
                    csv.MissingFieldAction = MissingFieldAction.ReplaceByEmpty; // importante per evitare che schianti !
                    csv.SkipEmptyLines = true;
                    int fieldCount = csv.FieldCount;

                    string[] headers = csv.GetFieldHeaders();
                    foreach (string nomeColonna in headers)
                    {
                        dtCsv.Columns.Add(nomeColonna);
                    }

                    while (csv.ReadNextRecord())
                    {
                        DataRow dr = dtCsv.NewRow();
                        for (int i = 0; i < fieldCount; i++)
                        {
                            //string valore = csv[i].Replace(",", "#").Replace(".", string.Empty).Replace("#", ".").Replace("+", String.Empty); // sostituisco virgola con punto e tolgo +
                            string valore = csv[i].Replace("'", string.Empty); 
                            Console.Write(string.Format("{0} = {1};", headers[i], valore));
                            dr[i] = valore;
                        }
                        dtCsv.Rows.Add(dr);
                    }
                }

                // Crea datatable per salvare i dati in tabella TransazioniGDN

                dtTransazioniGDN.Columns.Add("Portafoglio");
                dtTransazioniGDN.Columns.Add("Importo");
                dtTransazioniGDN.Columns.Add("DataValuta");
                dtTransazioniGDN.Columns.Add("DataOperazione");
                dtTransazioniGDN.Columns.Add("Descrizione");
                string portafoglio = string.Empty;
                ASPxGridView grid = gridlookupPortafogli.GridView;
                object objPortafoglio = grid.GetRowValues(grid.FocusedRowIndex, new string[] { "cod_rap" });
                if (objPortafoglio != null)
                {
                    portafoglio = objPortafoglio.ToString();
                    Session["cod_rap"] = portafoglio;
                }
                double Accredito = 0;
                double Addebito = 0;
                foreach (DataRow riga in dtCsv.Rows)
                {
                    if ((riga["Data di valutazione"].ToString().IndexOf("Saldo finale") != -1) || // Skippa se la colonna Data di Valutazione = 'Saldo finale' oppure...
                        (String.IsNullOrEmpty(riga["Prodotto"].ToString()) == true) ||            // Skippa se la colonna Prodotto non è valorizzata oppure...
                        (String.IsNullOrEmpty(riga["Importo singolo"].ToString()) == false) ||    // Skippa se la colonna Importo singolo è valorizzata oppure...
                        ((String.IsNullOrEmpty(riga["Accredito"].ToString()) == true) &&          // Skippa se la colonna Addebito e Accredito sono entrambe vuote
                         (String.IsNullOrEmpty(riga["Addebito"].ToString()) == true)
                        )

                       ) continue; 
                    DataRow dr = dtTransazioniGDN.NewRow(); 
                    dr["Portafoglio"] = portafoglio;
                    if (String.IsNullOrEmpty(riga["Accredito"].ToString()) == true) Accredito = 0;
                    else Accredito = Convert.ToDouble(riga["Accredito"].ToString().Replace(".", ","));
                    if (String.IsNullOrEmpty(riga["Addebito"].ToString()) == true) Addebito = 0;
                    else Addebito = Convert.ToDouble(riga["Addebito"].ToString().Replace(".", ","));
                    dr["Importo"] = (Accredito - Addebito).ToString();
                    dr["DataValuta"] = riga["Data di valuta"].ToString().Replace(".", "/");
                    dr["DataOperazione"] = riga["Data dell'operazione"].ToString().Replace(".", "/");
                    dr["Descrizione"] = riga["Descrizione 3"];
                    dtTransazioniGDN.Rows.Add(dr);
                }

            }

            // Cancella tabella TransazioniGDN prima di salvarci nuovamente i dati
            string result = CommonClass.ExecSql("GDN_Reconciliator_Delete");

            // Salva dati in TransazioniGDN se non ci sono stati errori in cancellazione
            if (result != "OK") CommonClass.MessageBox(this, result);
            else CommonClass.SqlBulkCopyTable(this, dtTransazioniGDN, "TransazioniGDN");

            return dtTransazioniGDN;
        }

        public DataTable ElaboraCSVBancaSella(UploadedFile uploadedFile)
        {
            // ref link: https://www.codeproject.com/Articles/9258/A-Fast-CSV-Reader
            DataTable dtCsv = new DataTable();
            DataTable dtTransazioniGDN = new DataTable();
            if (uploadedFile.IsValid) 
            {

                using (CsvReader csv =  new CsvReader(new StreamReader(uploadedFile.FileContent), true))
                {
                    csv.MissingFieldAction = MissingFieldAction.ReplaceByEmpty; // importante per evitare che schianti !

                    int fieldCount = csv.FieldCount;                   

                    string[] headers = csv.GetFieldHeaders();
                    foreach (string nomeColonna in headers)
                    {
                        dtCsv.Columns.Add(nomeColonna);
                    }
                    
                    while (csv.ReadNextRecord())
                    {
                        DataRow dr = dtCsv.NewRow();
                        for (int i = 0; i < fieldCount; i++)
                        {
                            string valore = csv[i].Replace(",", "#").Replace(".", string.Empty).Replace("#", ".").Replace("+", String.Empty); // sostituisco virgola con punto e tolgo +
                            Console.Write(string.Format("{0} = {1};", headers[i], valore)); 
                            dr[i] = valore;
                        }
                        dtCsv.Rows.Add(dr);
                    }
                }

                // Crea datatable per salvare i dati in tabella TransazioniGDN
                
                dtTransazioniGDN.Columns.Add("Portafoglio");
                dtTransazioniGDN.Columns.Add("Importo");
                dtTransazioniGDN.Columns.Add("DataValuta");
                dtTransazioniGDN.Columns.Add("DataOperazione");
                dtTransazioniGDN.Columns.Add("Descrizione");
                string portafoglio = string.Empty;
                ASPxGridView grid = gridlookupPortafogli.GridView;
                object objPortafoglio = grid.GetRowValues(grid.FocusedRowIndex, new string[] { "cod_rap" });
                if (objPortafoglio != null)
                {
                    portafoglio = objPortafoglio.ToString();
                    Session["cod_rap"] = portafoglio;
                }

                foreach (DataRow riga in dtCsv.Rows)
                {
                    if (riga["Descrizione"].ToString().IndexOf("Saldo") != -1) continue; // se è ultima riga con saldo allora la skippa
                    DataRow dr = dtTransazioniGDN.NewRow(); // "Codice identificativo","Data operazione","Data valuta","Descrizione","Divisa","Importo","Categoria","Etichette"
                    dr["Portafoglio"] = portafoglio;
                    dr["Importo"] = riga["Importo"].ToString().Replace(".",",");
                    dr["DataValuta"] = riga["Data valuta"];
                    dr["DataOperazione"] = riga["Data operazione"];
                    dr["Descrizione"] = riga["Descrizione"];
                    dtTransazioniGDN.Rows.Add(dr);
                }

            }

            // Cancella tabella TransazioniGDN prima di salvarci nuovamente i dati
            string result = CommonClass.ExecSql("GDN_Reconciliator_Delete");

            // Salva dati in TransazioniGDN se non ci sono stati errori in cancellazione
            if (result != "OK") CommonClass.MessageBox(this, result);
            else CommonClass.SqlBulkCopyTable(this, dtTransazioniGDN, "TransazioniGDN");

            return dtTransazioniGDN;
        }

        protected void btnImportaFlussoBanca_Click(object sender, EventArgs e)
        {


        }

        protected void btnRilevaMismatch_Click(object sender, EventArgs e)
        {
            if (rblBanca.SelectedIndex == -1)
            {
                CommonClass.MessageBox(this, "Errore - Selezionare banca e portafoglio prima di importare flusso dati!");
                return;
            }

            gvPtfMerged.DataSource = SqlDSPtfMerged;
            gvPtfMerged.DataBind();
        }

        protected void rblBanca_SelectedIndexChanged(object sender, EventArgs e)
        {
            Session["cod_ctp"] = rblBanca.SelectedItem.Value;
        }

        protected void gvPtfMerged_HtmlRowPrepared(object sender, ASPxGridViewTableRowEventArgs e)
        {
            if (e.RowType != GridViewRowType.Data) return;

            // Evidenzia le righe con colori differenti 
            if (e.GetValue("ImportoBanca") == DBNull.Value || e.GetValue("ImportoGDN") == DBNull.Value) e.Row.BackColor = Color.LightSalmon;
            // else e.Row.BackColor = Color.LightSeaGreen;
        }
    }
}