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 ScostamentoPerformance : System.Web.UI.Page
    {
        private static readonly string[] AdminUsers = { "fcostalonga", "fpisoni", "glicciardello", "erigo", "malfonsi" };

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

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

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


        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
            // per evitare problemi con sessioni "sporche"
            bool isRisk = AdminUsers.Contains(loggedUser);
            Session["is_risk_sp"] = isRisk;
            Session["user_display_sp"] = loggedUser;
            Session["user"] = loggedUser;

            if (!IsPostBack)
            {
                gridLookupGestore.DataBind();

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

                    Session["cod_ges_sp"] = 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_sp"] = (selectedValue == "-- TUTTI --") ? string.Empty : selectedValue;
            }
            else
            {
                Session["cod_ges_sp"] = string.Empty;
            }

            BindGrid();
        }

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

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

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

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

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

            // Commento: bloccato se BloccoCommento=true e non è Risk Manager
            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;
                }
            }

            // Note: sempre editabile, non segue la logica di blocco
            // (nessuna restrizione per il campo Note)

            // BloccoCommento: solo Risk Manager può modificare
            if (e.Column.FieldName == "BloccoCommento")
            {
                if (!IsRiskManager)
                {
                    e.Editor.ReadOnly = true;
                    e.Editor.Enabled = false;
                }
            }
        }

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

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

        protected void gvScostamentoPerformance_HtmlDataCellPrepared(object sender, ASPxGridViewTableDataCellEventArgs e)
        {
            // Colora solo Commento in rosa se bloccato (Note è sempre libero)
            if (e.DataColumn.FieldName != "Commento")
                return;

            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 GetScostamentoPerformanceData()
        {
            string gestore = Session["cod_ges_sp"]?.ToString() ?? string.Empty;

            using (var conn = new SqlConnection(ConnectionString))
            {
                using (var cmd = new SqlCommand("GDN_GetScostamentoPerformanceMensili", 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 = GetScostamentoPerformanceData();

            gvScostamentoPerformance.DataSource = dt;
            gvScostamentoPerformance.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 = "Nessuno scostamento performance trovato";
            }
        }

        protected void gvScostamentoPerformance_DataBinding(object sender, EventArgs e)
        {
            gvScostamentoPerformance.DataSource = GetScostamentoPerformanceData();
        }
    }
}
