using DevExpress.Web;
using System;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Web;

namespace OlympiaIntranet
{
    public partial class LimitiViolati : System.Web.UI.Page
    {
        private static readonly string[] AdminUsers = { "fcostalonga", "fpisoni", "glicciardello", "erigo", "malfonsi" };

        protected bool IsRiskManager
        {
            get { return Session["is_risk"] != null && (bool)Session["is_risk"]; }
        }

        private string ConnectionString
        {
            get { return System.Configuration.ConfigurationManager.ConnectionStrings["OlympiaIntranet.Properties.Settings.SqlConnection"].ConnectionString; }
        }

        // http://localhost:63155/LimitiViolati.aspx → usa l'utente loggato
        // http://localhost:63155/LimitiViolati.aspx?user=fcostalonga → simula Risk Manager
        // http://localhost:63155/LimitiViolati.aspx → usa l'utente loggato

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

        //    // Usa il parametro URL se presente (solo per debug), altrimenti l'utente loggato
        //    string loggedUser = Request.QueryString["user"];
        //    if (string.IsNullOrEmpty(loggedUser))
        //    {
        //        loggedUser = HttpContext.Current.User.Identity.Name;
        //    }

        //    if (!IsPostBack)
        //    {
        //        bool isRisk = AdminUsers.Contains(loggedUser);
        //        Session["is_risk"] = isRisk;
        //        Session["user_display"] = loggedUser;

        //        if (isRisk)
        //        {
        //            Session["user"] = loggedUser;
        //            gridLookupGestore.Enabled = true;
        //            Session["cod_ges"] = string.Empty;

        //            gridLookupGestore.DataBind();
        //            gridLookupGestore.Value = "-- TUTTI --";
        //        }
        //        else
        //        {
        //            string gestoreCode = loggedUser.Length > 1
        //                ? loggedUser.Substring(1).ToUpper()
        //                : loggedUser.ToUpper();

        //            Session["user"] = loggedUser;
        //            Session["cod_ges"] = gestoreCode;
        //            gridLookupGestore.Enabled = false;

        //            gridLookupGestore.DataBind();
        //            gridLookupGestore.Value = gestoreCode;
        //        }


        //        // Bind SEMPRE - necessario per DevExpress
        //        BindGrid();
        //    }
        //}

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

            // Usa il parametro URL se presente (solo per debug), altrimenti l'utente loggato
            string loggedUser = Request.QueryString["user"];
            if (string.IsNullOrEmpty(loggedUser))
            {
                loggedUser = HttpContext.Current.User.Identity.Name;
            }

            // SEMPRE determinare e impostare il ruolo ad ogni request
            bool isRisk = AdminUsers.Contains(loggedUser);
            Session["is_risk"] = isRisk;
            Session["user_display"] = loggedUser;
            Session["user"] = loggedUser;

            if (!IsPostBack)
            {
                // Forza il rebind del dropdown con l'utente corretto
                gridLookupGestore.DataBind();

                if (isRisk)
                {
                    gridLookupGestore.Enabled = true;
                    Session["cod_ges"] = string.Empty;
                    gridLookupGestore.Value = "-- TUTTI --";
                }
                else
                {
                    string gestoreCode = loggedUser.Length > 1
                        ? loggedUser.Substring(1).ToUpper()
                        : loggedUser.ToUpper();

                    Session["cod_ges"] = gestoreCode;
                    gridLookupGestore.Enabled = false;
                    gridLookupGestore.Value = gestoreCode;
                }

                BindGrid();
            }
        }

        protected void gridLookupGestore_ValueChanged(object sender, EventArgs e)
        {
            var gridLookup = sender as ASPxGridLookup;

            if (gridLookup?.Value != null)
            {
                string selectedValue = gridLookup.Value.ToString();
                Session["cod_ges"] = (selectedValue == "-- TUTTI --") ? string.Empty : selectedValue;
            }
            else
            {
                Session["cod_ges"] = string.Empty;
            }

            BindGrid();
        }

        //private void BindGrid()
        //{
        //    string gestore = Session["cod_ges"]?.ToString() ?? string.Empty;

        //    using (var conn = new SqlConnection(ConnectionString))
        //    {
        //        using (var cmd = new SqlCommand("GDN_GetLimitiViolatiMensili", conn))
        //        {
        //            cmd.CommandType = CommandType.StoredProcedure;
        //            cmd.Parameters.AddWithValue("@Gestore", gestore);

        //            var adapter = new SqlDataAdapter(cmd);
        //            var dt = new DataTable();
        //            adapter.Fill(dt);

        //            gvLimitiViolati.DataSource = dt;
        //            gvLimitiViolati.DataBind();

        //            // Aggiorna label mese riferimento
        //            if (dt.Rows.Count > 0 && dt.Columns.Contains("DataRiferimento"))
        //            {
        //                object dataRif = dt.Rows[0]["DataRiferimento"];
        //                if (dataRif != null && dataRif != DBNull.Value)
        //                {
        //                    DateTime data = Convert.ToDateTime(dataRif);
        //                    lblMeseRiferimento.Text = "Data di riferimento: " + data.ToString("dd-MM-yyyy");
        //                }
        //            }
        //            else
        //            {
        //                lblMeseRiferimento.Text = "Nessun limite violato trovato";
        //            }
        //        }
        //    }
        //}

        protected void gvLimitiViolati_RowUpdating(object sender, DevExpress.Web.Data.ASPxDataUpdatingEventArgs e)
        {
            try
            {
                int id = Convert.ToInt32(e.Keys["Id"]);
                string commento = e.NewValues["Commento"]?.ToString() ?? string.Empty;
                bool bloccoCommento = e.NewValues["BloccoCommento"] != null && Convert.ToBoolean(e.NewValues["BloccoCommento"]);
                string utente = Session["user_display"]?.ToString() ?? "unknown";
                bool isRiskManager = IsRiskManager;

                using (var conn = new SqlConnection(ConnectionString))
                {
                    using (var cmd = new SqlCommand("GDN_AggiornaCommentoLimite", conn))
                    {
                        cmd.CommandType = CommandType.StoredProcedure;
                        cmd.Parameters.AddWithValue("@Id", id);
                        cmd.Parameters.AddWithValue("@Commento", commento);
                        cmd.Parameters.AddWithValue("@BloccoCommento", bloccoCommento);
                        cmd.Parameters.AddWithValue("@Utente", utente);
                        cmd.Parameters.AddWithValue("@IsRiskManager", isRiskManager);

                        conn.Open();
                        cmd.ExecuteNonQuery();
                    }
                }

                e.Cancel = true;
                gvLimitiViolati.CancelEdit();
                BindGrid();
            }
            catch (SqlException ex)
            {
                e.Cancel = true;
                gvLimitiViolati.CancelEdit();
                lblMeseRiferimento.Text = "Errore: " + ex.Message;
            }
        }

        protected void gvLimitiViolati_CellEditorInitialize(object sender, ASPxGridViewEditorEventArgs e)
        {
            var grid = sender as ASPxGridView;

            if (e.Column.FieldName == "Commento")
            {
                bool bloccato = false;
                object valBlocco = grid.GetRowValues(e.VisibleIndex, "BloccoCommento");
                if (valBlocco != null && valBlocco != DBNull.Value)
                {
                    bloccato = Convert.ToBoolean(valBlocco);
                }

                if (bloccato && !IsRiskManager)
                {
                    e.Editor.ReadOnly = true;
                    e.Editor.BackColor = Color.LightGray;
                }
            }

            if (e.Column.FieldName == "BloccoCommento")
            {
                if (!IsRiskManager)
                {
                    e.Editor.ReadOnly = true;
                    e.Editor.Enabled = false;
                }
            }
        }

        protected void gvLimitiViolati_DataBound(object sender, EventArgs e)
        {
            // Lasciato vuoto - la label viene aggiornata in BindGrid()
        }

        protected void gvLimitiViolati_CancelRowEditing(object sender, DevExpress.Web.Data.ASPxStartRowEditingEventArgs e)
        {
            // Gestione annullamento edit
        }

        protected void gvLimitiViolati_HtmlDataCellPrepared(object sender, ASPxGridViewTableDataCellEventArgs e)
        {
            // Solo per la colonna Commento
            if (e.DataColumn.FieldName != "Commento")
                return;

            // Leggi il valore di BloccoCommento per questa riga
            object valBlocco = e.GetValue("BloccoCommento");
            bool bloccato = valBlocco != null && valBlocco != DBNull.Value && Convert.ToBoolean(valBlocco);

            if (bloccato)
            {
                e.Cell.BackColor = Color.FromArgb(255, 230, 230); // Rosso chiaro/rosa
                e.Cell.ToolTip = "Commento bloccato";
            }
        }

        private DataTable GetLimitiViolatiData()
        {
            string gestore = Session["cod_ges"]?.ToString() ?? string.Empty;

            using (var conn = new SqlConnection(ConnectionString))
            {
                using (var cmd = new SqlCommand("GDN_GetLimitiViolatiMensili", conn))
                {
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.AddWithValue("@Gestore", gestore);

                    var adapter = new SqlDataAdapter(cmd);
                    var dt = new DataTable();
                    adapter.Fill(dt);
                    return dt;
                }
            }
        }

        private void BindGrid()
        {
            var dt = GetLimitiViolatiData();

            gvLimitiViolati.DataSource = dt;
            gvLimitiViolati.DataBind();

            // Aggiorna label mese riferimento
            if (dt.Rows.Count > 0 && dt.Columns.Contains("DataRiferimento"))
            {
                object dataRif = dt.Rows[0]["DataRiferimento"];
                if (dataRif != null && dataRif != DBNull.Value)
                {
                    DateTime data = Convert.ToDateTime(dataRif);
                    lblMeseRiferimento.Text = "Mese di riferimento: " + data.ToString("dd-MM-yyyy");
                }
            }
            else
            {
                lblMeseRiferimento.Text = "Nessun limite violato trovato";
            }
        }

        protected void gvLimitiViolati_DataBinding(object sender, EventArgs e)
        {
            //var grid = sender as ASPxGridView;
            //grid.DataSource = GetLimitiViolatiData();
            gvLimitiViolati.DataSource = GetLimitiViolatiData();
        }
    }
}