using DevExpress.Export;
using DevExpress.Web;
using DevExpress.XtraPrinting;
using DevExpress.XtraPrintingLinks;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using MySqlConnector;
using System.Data.SqlClient;
using System.Data;
using System.Globalization;
using System.Threading;
using DevExpress.Spreadsheet;

namespace OlympiaIntranet
{
    public partial class AndamentoRaccolta : System.Web.UI.Page
    {
        protected void Page_Init(object sender, EventArgs e)
        {
            // Imposta la cultura per la pagina specifica
            CultureInfo ci = new CultureInfo("en-US");
            ci.NumberFormat.NumberGroupSeparator = ".";
            ci.NumberFormat.NumberDecimalSeparator = ",";
            Thread.CurrentThread.CurrentCulture = ci;
            Thread.CurrentThread.CurrentUICulture = ci;
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            if (HttpContext.Current.User.Identity.IsAuthenticated == false)
            {
                Response.Redirect("~/SignIn.aspx");
            }
            else
            {
                if (!IsPostBack)
                {
                    BindGridView(gvRaccoltaGestori, "GDN_RaccoltaGestori");
                    BindGridView(gvRaccoltaConsulenti, "GDN_RaccoltaConsulenti");
                    BindGridView(gvSituazioneConti, "GDN_RaccoltaConsulenti_NumConti");
                }
            }


        }
        protected void ASPxRibbon1_CommandExecuted(object source, DevExpress.Web.RibbonCommandExecutedEventArgs e)
        {
            // Selezionato pulsante Refresh
            if (e.Item.Name == "loadGrid")
            {
                RibbonTemplateItem template = (RibbonTemplateItem)ASPxRibbon1.Tabs[0].Groups[0].Items.FindByName("ribbonTemplate");
                ASPxDateEdit deDataInizio = template.FindControl("dataInizio") as ASPxDateEdit;
                if (String.IsNullOrEmpty(deDataInizio.Text))
                {
                    CommonClass.MessageBox(this, "Inserire data inizio!");
                    return;
                }

                ASPxDateEdit deDataFine = template.FindControl("dataFine") as ASPxDateEdit;
                if (String.IsNullOrEmpty(deDataFine.Text))
                {
                    CommonClass.MessageBox(this, "Inserire data fine!");
                    return;
                }

                // recupero il valore del ribbondateedit dataInizio
                Session["data_inizio"] = deDataInizio.Date;

                // recupero il valore del ribbondateedit dataFine
                Session["data_fine"] = deDataFine.Date;


                // Verifica che dataInizio sia minore di dataFine
                if (deDataInizio.Date > deDataFine.Date)
                {
                    CommonClass.MessageBox(this, "Data inizio deve essere minore di Data fine!");
                    return;
                }

                // Se i controlli sono passati allora linka datasource a grdiview...
                //gvRaccoltaConsulenti.DataSourceID = "SqlDSRaccoltaConsulenti";
                //gvRaccoltaConsulenti.KeyFieldName = "ID";
                //gvRaccoltaConsulenti.DataBind();
                // Nota del 05-02-2025: ho dovuto implementare la chiamata lato codice altrimenti usando il Datasource non funzionava perchè l'sp GDN_RaccoltaConsulenti utilizza una query dinamica e non veniva riconosciuta la tabella temporanea #GDNConsulenti!
                //BindGridView();
                BindGridView(gvRaccoltaGestori, "GDN_RaccoltaGestori");
                BindGridView(gvRaccoltaConsulenti, "GDN_RaccoltaConsulenti");
                BindGridView(gvSituazioneConti, "GDN_RaccoltaConsulenti_NumConti");

            }
            // Selezionato pulsante Export in Excel
            if (e.Item.Name == "exportExcel")
            {

                // Preparazione esportatori
                BindGridView(gvRaccoltaConsulenti, "GDN_RaccoltaConsulenti");
                BindGridView(gvRaccoltaGestori, "GDN_RaccoltaGestori");

                // Ref link: https://www.devexpress.com/Support/Center/Question/Details/T327338/aspxgridview-export-multiple-grids-to-the-same-excel-file
                PrintingSystem ps = new PrintingSystem();

                // Esporta griglia Raccolta Gestori
                PrintableComponentLink link0 = new PrintableComponentLink(ps);
                ExporterRaccoltaGestori.ExportSelectedRowsOnly = false;
                string reportHeader0 = string.Format(@"Estrazione Raccolta Gestori dal {0} al {1}", Convert.ToDateTime(Session["data_inizio"]).ToString("dd/MM/yyyy"), Convert.ToDateTime(Session["data_fine"]).ToString("dd/MM/yyyy"));
                ExporterRaccoltaGestori.ReportHeader = @"{\rtf1\ansi\ansicpg1252\deff0\deflang1040{\fonttbl{\f0\fnil\fcharset0 Tahoma;}{\f1\fnil\fcharset0 Times New Roman;}}\viewkind4\uc1\pard\b\f0\fs28 " + reportHeader0 + @"\b0\f1\fs20\par}";
                link0.Component = ExporterRaccoltaGestori;

                // Esporta griglia Raccolta Consulenti
                PrintableComponentLink link1 = new PrintableComponentLink(ps);
                ExporterRaccoltaConsulenti.ExportSelectedRowsOnly = false;
                string reportHeader1 = string.Format(@"Estrazione Raccolta Consulenti dal {0} al {1}", Convert.ToDateTime(Session["data_inizio"]).ToString("dd/MM/yyyy"), Convert.ToDateTime(Session["data_fine"]).ToString("dd/MM/yyyy"));
                ExporterRaccoltaConsulenti.ReportHeader = @"{\rtf1\ansi\ansicpg1252\deff0\deflang1040{\fonttbl{\f0\fnil\fcharset0 Tahoma;}{\f1\fnil\fcharset0 Times New Roman;}}\viewkind4\uc1\pard\b\f0\fs28 " + reportHeader1 + @"\b0\f1\fs20\par}";
                link1.Component = ExporterRaccoltaConsulenti;


                // Compone excel unico 
                CompositeLink compositeLink = new CompositeLink(ps);
                compositeLink.Links.AddRange(new object[] { link0, link1 });
                compositeLink.CreatePageForEachLink();

                string fileName = string.Format("{0}_{1}", DateTime.Now.ToString("yyyyMMdd_HHmm"), "Andamento Raccolta.xlsx");
                using (MemoryStream stream = new MemoryStream())
                {
                    XlsxExportOptionsEx options = new XlsxExportOptionsEx();
                    options.ExportMode = XlsxExportMode.SingleFilePageByPage;
                    options.ExportType = ExportType.WYSIWYG;
                    compositeLink.PrintingSystemBase.ExportToXlsx(stream, options);
                    Response.Clear();
                    Response.Buffer = false;
                    Response.AppendHeader("Content-Type", "application/xlsx");
                    Response.AppendHeader("Content-Transfer-Encoding", "binary");
                    Response.AppendHeader("Content-Disposition", $"attachment; filename={fileName}");
                    stream.Position = 0;

                    Workbook workbook = new Workbook();
                    workbook.LoadDocument(stream, DevExpress.Spreadsheet.DocumentFormat.OpenXml);
                    DevExpress.Spreadsheet.WorksheetCollection worksheets = workbook.Worksheets;
                    workbook.Worksheets[0].Name = "Raccolta Gestori";
                    workbook.Worksheets[1].Name = "Raccolta Consulenti";
                    using (MemoryStream outputStream = new MemoryStream())
                    {
                        workbook.SaveDocument(outputStream, DevExpress.Spreadsheet.DocumentFormat.OpenXml);
                        Response.BinaryWrite(outputStream.ToArray());
                        Response.End();
                    }
                }
                ps.Dispose();
            }
        }

        private DataTable GetDynamicData(string query, DateTime DataInizio, DateTime DataFine)
        {
            //string query = "GDN_RaccoltaConsulenti";

            using (SqlConnection conn = new SqlConnection(OlympiaIntranet.Properties.Settings.Default.SqlConnection))
            {
                using (SqlCommand cmd = new SqlCommand(query, conn))
                {
                    cmd.CommandType = CommandType.StoredProcedure;

                    // Aggiungi i parametri
                    cmd.Parameters.Add(new SqlParameter("@DataInizio", SqlDbType.Date) { Value = DataInizio });
                    cmd.Parameters.Add(new SqlParameter("@DataFine", SqlDbType.Date) { Value = DataFine });

                    using (SqlDataAdapter da = new SqlDataAdapter(cmd))
                    {
                        DataTable dt = new DataTable();
                        da.Fill(dt);
                        return dt;
                    }
                }
            }
        }

        private void BindGridView(ASPxGridView gridview, string query)
        {
            if ((Session["data_inizio"] is null) || (Session["data_fine"] is null)) return;
            DataTable dt = GetDynamicData(query,(DateTime)Session["data_inizio"], (DateTime)Session["data_fine"]);
            gridview.DataSource = dt;

            gridview.Columns.Clear();

            foreach (DataColumn column in dt.Columns)
            {
                if (column.ColumnName != "ID")
                {
                    GridViewDataTextColumn gridColumn = new GridViewDataTextColumn();
                    gridColumn.FieldName = column.ColumnName;
                    gridColumn.Caption = column.ColumnName;
                    gridview.Columns.Add(gridColumn);
                    gridview.Settings.ShowFooter = true;
                }
            }

            gridview.DataBind();
        }


        protected void gvRaccoltaConsulenti_DataBound(object sender, EventArgs e)
        {
            // ref : https://www.devexpress.com/Support/Center/Question/Details/Q585537/aspxgridview-autogeneratecolumns-true-field-name-start-with-lower-case-letter-insert-a
            // Evita che a runtime le colonne con maiuscole nella query vengono scritte con lo spazio (ad esempio codiceIsin -> codice Isin) 
            // questo poi crea un problema andando a esportare l'excel dove serve che le colonne siano le stesse della query.
            DataBound(sender);

            // Totale Conti Aperti
            DataTable dtContiAperti = GetDynamicData("GDN_RaccoltaConsulenti_ContiAperti", (DateTime)Session["data_inizio"], (DateTime)Session["data_fine"]);
            tbTotContiAperti.Text = dtContiAperti.Rows[0][0].ToString();

            // Totale Conti Chiusi
            DataTable dtContiChiusi = GetDynamicData("GDN_RaccoltaConsulenti_ContiChiusi", (DateTime)Session["data_inizio"], (DateTime)Session["data_fine"]);
            tbTotContiChiusi.Text = dtContiChiusi.Rows[0][0].ToString();
        }

        protected void gvRaccoltaConsulenti_CustomSummaryCalculate(object sender, DevExpress.Data.CustomSummaryEventArgs e)
        {
            CustomSummaryCalculate(sender, e);
        }

        protected void gvRaccoltaConsulenti_HtmlFooterCellPrepared(object sender, ASPxGridViewTableFooterCellEventArgs e)
        {
            HtmlFooterCellPrepared(e);
        }

        private static void HtmlFooterCellPrepared(ASPxGridViewTableFooterCellEventArgs e)
        {
            if (e.Column is GridViewDataColumn dataColumn && dataColumn.FieldName != "ID" && dataColumn.FieldName != "Mese")
            {
                e.Cell.Text = e.Cell.Text.Replace("Sum=", ""); // Rimuove 'Sum=' dal testo del footer
                e.Cell.Style["font-weight"] = "bold"; // Imposta il testo in grassetto
            }
            ;
            if (e.Column is GridViewDataColumn dataColumn1 && dataColumn1.FieldName == "Mese")
            {
                e.Cell.Text = e.Cell.Text = "Totale"; // Rimuove 'Sum=' dal testo del footer
                e.Cell.Style["font-weight"] = "bold"; // Imposta il testo in grassetto
            }
            ;
        }

        protected void gvRaccoltaConsulenti_SummaryDisplayText(object sender, ASPxGridViewSummaryDisplayTextEventArgs e)
        {
            SummaryDisplayText(e);
        }

        private static void SummaryDisplayText(ASPxGridViewSummaryDisplayTextEventArgs e)
        {
            if (e.Item.FieldName != "Mese" && e.Item.FieldName != "ID" && e.Item.SummaryType == DevExpress.Data.SummaryItemType.Sum)
            {
                e.Text = string.Format("{0:N0}", e.Value);
            }
        }

        protected void gvRaccoltaGestori_DataBound(object sender, EventArgs e)
        {
            // ref : https://www.devexpress.com/Support/Center/Question/Details/Q585537/aspxgridview-autogeneratecolumns-true-field-name-start-with-lower-case-letter-insert-a
            // Evita che a runtime le colonne con maiuscole nella query vengono scritte con lo spazio (ad esempio codiceIsin -> codice Isin) 
            // questo poi crea un problema andando a esportare l'excel dove serve che le colonne siano le stesse della query.
            DataBound(sender);
        }

        private void DataBound(object sender)
        {
            double TotRaccolta = 0;
            ASPxGridView gridview = sender as ASPxGridView;

            if (gridview.Columns.Count > 0)
            {
                gridview.TotalSummary.Clear();
                foreach (GridViewColumn column in gridview.Columns)
                {
                    if (column is GridViewDataColumn)
                    {
                        if (column.Name != "ID" && column.Name != "Mese")
                        {
                            ASPxSummaryItem summaryItem = new ASPxSummaryItem();
                            summaryItem.FieldName = ((GridViewDataColumn)column).FieldName;
                            summaryItem.SummaryType = DevExpress.Data.SummaryItemType.Sum;
                            summaryItem.DisplayFormat = "{0}"; // Rimuove 'Sum='
                            gridview.TotalSummary.Add(summaryItem);
                           
                            ((GridViewDataColumn)column).PropertiesEdit.DisplayFormatString = "N0";

                            // Calcola totale per tutte le colonne presenti (il valore fra Gestori e Consulenti è lo stesso!)
                            TotRaccolta += Convert.ToDouble(gridview.GetTotalSummaryValue(summaryItem));
                        }
                    }

                }

                tbTotaleRaccolta.Text = $"{TotRaccolta:N0}";
            }
        }

        protected void gvRaccoltaGestori_CustomSummaryCalculate(object sender, DevExpress.Data.CustomSummaryEventArgs e)
        {
            CustomSummaryCalculate(sender, e);
        }

        private static void CustomSummaryCalculate(object sender, DevExpress.Data.CustomSummaryEventArgs e)
        {
            if (e.SummaryProcess == DevExpress.Data.CustomSummaryProcess.Finalize)
            {
                ASPxGridView grid = sender as ASPxGridView;
                ASPxSummaryItem summaryItem = e.Item as ASPxSummaryItem;

                if (summaryItem != null && summaryItem.FieldName != "Mese") // Presuming 'Mese' is a fixed column
                {
                    decimal total = 0;

                    for (int i = 0; i < grid.VisibleRowCount; i++)
                    {
                        object value = grid.GetRowValues(i, summaryItem.FieldName);
                        total += (value != DBNull.Value) ? Convert.ToDecimal(value) : 0;
                    }

                    e.TotalValue = total;
                }
            }
        }

        protected void gvRaccoltaGestori_HtmlFooterCellPrepared(object sender, ASPxGridViewTableFooterCellEventArgs e)
        {
            HtmlFooterCellPrepared(e);
        }
        

        protected void gvRaccoltaGestori_SummaryDisplayText(object sender, ASPxGridViewSummaryDisplayTextEventArgs e)
        {
            SummaryDisplayText(e);
        }

        protected void gvSituazioneConti_DataBound(object sender, EventArgs e)
        {

        }
    }
}