using DevExpress.Web;
using DevExpress.XtraCharts;
using DevExpress.XtraCharts.Native;
using DevExpress.XtraCharts.Web;
using DevExpress.Pdf;
using DevExpress.XtraPrinting;
using DevExpress.XtraGrid;
using System;
using System.Collections.Generic;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using DevExpress.Utils;
using DevExpress.XtraReports.UI;
using DevExpress.XtraReports.Web;

namespace OlympiaIntranet
{

    public partial class GPMDispRendRisk : System.Web.UI.Page
    {
        string[] adminUser = new string[] { "fcostalonga", "ecanziani", "fpisoni", "glicciardello" };
        protected void Page_Init(object sender, EventArgs e)
        {
            if (DateTime.Now.Date.DayOfWeek == DayOfWeek.Monday) dateEditDataIns.Date = DateTime.Now.Date.AddDays(-3); // se è lunedì prende 3 giorni prima ossia venerdì
            else
                if (DateTime.Now.Date.DayOfWeek == DayOfWeek.Sunday) dateEditDataIns.Date = DateTime.Now.Date.AddDays(-2); // se è lunedì prende 2 giorni prima ossia venerdì
            else
                dateEditDataIns.Date = DateTime.Now.Date.AddDays(-1); // .. in tutti gli altri casi cioè se è martedì,...sabato allora prende il giorno precedente
        }

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

                if (adminUser.Contains(loggedUser) == true) { gridLookupGestore.Enabled = true; }
                else
                {
                    gridLookupGestore.Value = loggedUser.Substring(1).ToUpper();
                    gridLookupGestore.Enabled = false;
                }
                //switch (loggedUser)
                //{
                //    // Gestori
                //    case "sbettinelli":
                //        gridLookupGestore.Value = "BETTINELLI";
                //        gridLookupGestore.Enabled = false;
                //        break;
                //    case "agamba":
                //        gridLookupGestore.Value = "GAMBA";
                //        gridLookupGestore.Enabled = false;
                //        break;
                //    case "rcammarino":
                //        gridLookupGestore.Value = "CAMMARINO";
                //        gridLookupGestore.Enabled = false;
                //        break;
                //    case "rtorre":
                //        gridLookupGestore.Value = "TORRE";
                //        gridLookupGestore.Enabled = false;
                //        break;
                //    case "adonini":
                //        gridLookupGestore.Value = "DONINI";
                //        gridLookupGestore.Enabled = false;
                //        break;
                //    case "lbrambilla":
                //        gridLookupGestore.Value = "BRAMBILLA";
                //        gridLookupGestore.Enabled = false;
                //        break;
                //    default:
                //        gridLookupGestore.Enabled = true; // gli altri gestori abilitati a vedere tutto sono fcostalonga, ecanziani, fpisoni, glicciardello
                //        break;
                //}

                Session["cod_ges"] = gridLookupGestore.Value; // serve per popolare gridlookupLinea!!
                //Session["cod_adv"] = gridLookupAdvisor.Value; // serve per popolare gridlookupLinea!!
                Session["user"] = loggedUser; // serve per popolare gridlookupGestore!!
            }

            if (IsPostBack) // Rielabora il grafico altrimenti il print non la stampa.
            {
                PlottaPointChart();
            }
        }

        private void PlottaPointChart()
        {
            // Carica dati in dtStackedBarsData 
            ASPxGridView grid = gridLookupGestore.GridView;
            object objGestore = grid.GetRowValues(grid.FocusedRowIndex, new string[] { "Gestore" });
            grid = gridLookupLinea.GridView;
            object objLinea = grid.GetRowValues(grid.FocusedRowIndex, new string[] { "Linea" });
            //grid = gridLookupAdvisor.GridView;
            //object objAdvisor = grid.GetRowValues(grid.FocusedRowIndex, new string[] { "Advisor" });
            //if (!(objGestore != null && objLinea != null && objAdvisor != null)) return;
            if (!(objGestore != null && objLinea != null)) return;

            // nota: esiste pure GDN_GPMDispRendRisk_PointCharts1 e GDN_GPM_Gestori1 perchè Filippo voleva avere l'opzione -- TUTTI -- sui gestori, ma poi il grafico si vedeva tutto incasinato e abbiamo desistito (07/06/2022)
            DataTable dtPointsChartData = CommonClass.execQuery_Datatable_Sql("GDN_GPMDispRendRisk_PointCharts2",
                                                                              Properties.Settings.Default.SqlConnection,
                                                                              (string)objGestore,
                                                                              "",
                                                                              (string)objLinea
                                                                              ,
                                                                              -1,
                                                                              -1,
                                                                              dateEditDataIns.Date,
                                                                              "",
                                                                              "",
                                                                              null,
                                                                              "");

            Session["dtPointsChartData"] = dtPointsChartData;

            pointChart.DataSource = dtPointsChartData;

            // Cancella tutte le serie prima di plottare 
            pointChart.Series.Clear();

            // Cancella tutti i titoli della serie prima di plottare
            pointChart.Titles.Clear();

            // Rimuove legenda aggiuntiva dei portafogli
            pointChart.Legends.Clear();

            // Setta titolo del grafico
            SettaTitoloGrafico(pointChart);

            string seriesName = $"{(string)objLinea}";
            Series series = new Series(seriesName, ViewType.Point);
            series.ArgumentScaleType = ScaleType.Numerical;
            series.LabelsVisibility = DefaultBoolean.True;
            series.Label.TextPattern = "{HINT}";
            series.ArgumentDataMember = "VaR Medio 95";
            series.ValueDataMembers[0] = "Performance YTD";
            series.ShowInLegend = false;
            series.CrosshairContentShowMode = CrosshairContentShowMode.Label;
            //series.CrosshairHighlightPoints = DefaultBoolean.True; // non funziona
            //pointChart.CrosshairOptions.HighlightPoints = true;    // non funziona

            (series.Label as PointSeriesLabel).ResolveOverlappingMode = ResolveOverlappingMode.JustifyAroundPoint;
            foreach (DataRow row in dtPointsChartData.Rows)
            {
                if (
                    ((string)objLinea != "-- TUTTI --")                                                          // E' selezionata la singola linea allora deve visualizzare il singolo punto limite var che è uguale per tutti i ptf.
                    ||                                                                                           // oppure 
                    ((string)objLinea == "-- TUTTI --" && row["Codice Portafoglio"].ToString() != "LIMITE VAR")  // Sono selezionate tutte le linee ma viene escluso ptf=LIMITE VAR per plottare tutti i punti 
                   )
                {
                    SeriesPoint sp = new SeriesPoint(row["VaR Medio 95"], row["Performance YTD"]);
                    sp.Tag = new { Portafoglio = $"Portafoglio: {row["Codice Portafoglio"]}", Cliente = $"Cliente: {row["Cliente"]}" }; // link https://supportcenter.devexpress.com/ticket/details/t757258/how-to-display-custom-data-in-the-crosshair-label-text
                    //if (row["Codice Portafoglio"].ToString() != "LIMITE VAR") sp.ToolTipHint = string.Format("{0} - {1}", row["Codice Portafoglio"], row["Cliente"]); // tolto su richiesta di Filippo e spostato in proprietà CrosshairLabelPattern
                    series.Points.Add(sp);
                }
                //if ((string)objLinea == "-- TUTTI --" && row["Codice Portafoglio"].ToString() != "LIMITE VAR") // se sono selezionate tutte le linee allora non deve visualizzare punto limite var perchè ce ne sarebbero più di uno
                //{
                //    SeriesPoint sp = new SeriesPoint(row["VaR Medio 95"], row["Performance YTD"]);
                //    sp.Tag = new { Portafoglio = $"Portafoglio: {row["Codice Portafoglio"]}", Cliente = $"Cliente: {row["Cliente"]}" }; // link https://supportcenter.devexpress.com/ticket/details/t757258/how-to-display-custom-data-in-the-crosshair-label-text                    
                //    series.Points.Add(sp);
                //}
            }
            series.CrosshairLabelPattern = "{Portafoglio} \r\n {Cliente} \r\n Var Medio 95%: {A:F2}% \r\n Perf YTD: {V:F2}%"; // ref link : https://docs.devexpress.com/CoreLibraries/DevExpress.XtraCharts.SeriesBase.CrosshairLabelPattern
            pointChart.Series.Add(series);

            XYDiagram diagram = (XYDiagram)pointChart.Diagram;
            if (diagram != null)
            {
                diagram.AxisX.Title.Text = "VAR MEDIO 95%";
                diagram.AxisX.Title.Visibility = DefaultBoolean.True;
                diagram.AxisY.Title.Text = "PERFORMANCE YTD";
                diagram.AxisY.Title.Visibility = DefaultBoolean.True;

                // Setta var max sul grafico (plottato solo se una linea è selezionata)
                SettaVarMax(pointChart, dtPointsChartData, (string)objLinea);
            }
        }

        private void SettaVarMax(WebChartControl pointChart, DataTable dtPointsChartData, string Linea)
        {
            // Cancella eventuali precedenti linee verticali
            XYDiagram diagram = (XYDiagram)pointChart.Diagram;
            diagram.AxisX.ConstantLines.Clear();

            // Se è selezionata una singola linea, allora rileva il limite var prendendo il primo ptf in dtPointsChartData e leggendo il valore da tabraplim
            if (Linea != "-- TUTTI --")
            {
                double limiteVar = (from r in dtPointsChartData.AsEnumerable()
                                    select Convert.ToDouble(r["LimiteVar"])).FirstOrDefault();
                ConstantLine cl1 = new ConstantLine("Limite VaR");

                cl1.AxisValue = limiteVar;
                cl1.Visible = true;
                cl1.ShowBehind = false;
                cl1.Color = System.Drawing.Color.Red;
                cl1.LineStyle.DashStyle = DashStyle.Solid;
                cl1.LineStyle.Thickness = 2;
                cl1.ShowInLegend = false;

                diagram.AxisX.ConstantLines.Add(cl1);

                // Define the whole range for the X-axis. 
                //diagram.AxisX.WholeRange.Auto = false;
                //diagram.AxisX.WholeRange.SetMinMaxValues(0, limiteVar * 0.2);
            }
        }

        private void SettaTitoloGrafico(WebChartControl chartControl)
        {
            // Create chart titles.
            ChartTitle chartTitle1 = new ChartTitle();
            ChartTitle chartTitle2 = new ChartTitle();
            // Define the text for the titles.
            chartTitle1.Text = "<b>GPM DISPERSION RISK / REND</b>";

            chartTitle2.Text = TitoloFiltri();

            chartTitle2.WordWrap = true;
            chartTitle2.MaxLineCount = 2;

            // Define the alignment of the titles.
            chartTitle1.Alignment = StringAlignment.Center;
            chartTitle2.Alignment = StringAlignment.Center;

            // Place the titles where it's required.
            chartTitle1.Dock = ChartTitleDockStyle.Top;
            chartTitle2.Dock = ChartTitleDockStyle.Top;

            // Customize a title's appearance.
            chartTitle1.EnableAntialiasing = DevExpress.Utils.DefaultBoolean.True;
            chartTitle1.Font = new Font("Tahoma", 14, FontStyle.Bold);
            chartTitle1.TextColor = Color.Blue;
            chartTitle1.Indent = 10;

            // Customize a title's appearance.
            chartTitle2.EnableAntialiasing = DevExpress.Utils.DefaultBoolean.True;
            chartTitle2.Font = new Font("Arial", 10, FontStyle.Bold);
            chartTitle2.TextColor = Color.Black;
            chartTitle2.Indent = 10;

            // Add the titles to the chart.
            chartControl.Titles.AddRange(new ChartTitle[] { chartTitle1, chartTitle2 });
        }
        private string TitoloFiltri()
        {
            string filtro = String.Empty;
            if (String.IsNullOrEmpty(gridLookupGestore.Text) == true) { filtro += "Gestore: tutti "; } else { filtro += $"Gestore: {gridLookupGestore.Text} "; }
            //if (String.IsNullOrEmpty(gridLookupAdvisor.Text) == true) { filtro += "Advisor: tutti "; } else { filtro += $"Advisor: {gridLookupAdvisor.Text} "; }
            if (String.IsNullOrEmpty(gridLookupLinea.Text) == true) { filtro += "Linea: tutti "; } else { filtro += $"Linea: {gridLookupLinea.Text} "; }
            return (filtro);
        }

        protected void buttonGeneraGrafici_Click(object sender, EventArgs e)
        {
            PlottaPointChart();
        }

        protected void buttonEsportaPdf_Click(object sender, EventArgs e)
        {
            /*
              // Esporta grafico in pdf 
              var ps = new PrintingSystem();
              ps.PageSettings.Landscape = true;
              var link1 = new PrintableComponentLink();
              pointChart.DataBind();

              link1.Component = ((IChartContainer)pointChart).Chart;
              link1.Landscape = true;
              link1.PrintingSystem = ps;
              link1.CreateDocument();
              ps.Document.AutoFitToPagesWidth = 1; // Fit to page 

              using (var stream = new MemoryStream())
              {
                  link1.PrintingSystem.ExportToPdf(stream);
                  Response.Clear();
                  Response.Buffer = false;
                  Response.AppendHeader("Content-Type", "application/pdf");
                  Response.AppendHeader("Content-Transfer-Encoding", "binary");
                  Response.AppendHeader("Content-Disposition", $"attachment; filename=GPMDispRendRisk_{DateTime.Now.Date.ToString("yyyyMMdd")}.pdf");
                  Response.BinaryWrite(stream.GetBuffer());
                  Response.End();
              }
              ps.Dispose();

             */

            /*
            XtraReport r = new XtraReport();
            r.Bands.Add(new DetailBand());
            r.Bands[BandKind.Detail].Height = Convert.ToInt32(pointChart.Height.Value * pointChart.Width.Value / (r.PageWidth - r.Margins.Left - r.Margins.Right));
            XRChart chart = new XRChart();
            ((IChartContainer)chart).Assign(((IChartContainer)pointChart).Chart);
            r.Bands[BandKind.Detail].Controls.Add(chart);
            chart.Size = new Size(r.PageWidth - r.Margins.Left - r.Margins.Right, r.Bands[BandKind.Detail].Height);

            ReportViewer rv = new ReportViewer();
            rv.Report = r;
            r.ExportOptions.Pdf.ShowPrintDialogOnOpen = true;
            r.Landscape = true;
            rv.WritePdfTo(this.Response);
            */
        }

        protected void gridLookupGestore_ValueChanged(object sender, EventArgs e)
        {
            // ref: https://supportcenter.devexpress.com/ticket/details/q340370/aspxgridlookup-how-to-refresh-the-control-after-some-data-is-changed
            // note: Per refreshare gridlookupLinea e gridlookupAdvisor sulla base del valore di gridLookupGestore, salvo il valore gestore in una variabile di sessione Session["cod_ges"] 
            //       e poi il refresh/rebind di SqlDSLinee e SqlDSAdvisor verrà effettuato nell'evento lato client EndCallBack

            ASPxGridView grid = gridLookupGestore.GridView;
            object objGestore = grid.GetRowValues(grid.FocusedRowIndex, new string[] { "Gestore" });

            if (objGestore != null)
            {
                Session["cod_ges"] = (string)objGestore;
            }

        }

        //protected void gridLookupAdvisor_ValueChanged(object sender, EventArgs e)
        //{
        //    ASPxGridView grid = gridLookupAdvisor.GridView;
        //    object objAdvisor = grid.GetRowValues(grid.FocusedRowIndex, new string[] { "Advisor" });

        //    if (objAdvisor != null)
        //    {
        //        Session["cod_adv"] = (string)objAdvisor;
        //    }
        //}
    }
}