using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Windows.Forms;
using MercatorApi;
using MercatorUi;

namespace SigStock
{
    public class Customizer : MercatorUi.ICustomizers.IFormLoadCustomizer, MercatorUi.ICustomizers.IFormClosedCustomizer
    {

        public void FormLoadCustomize(Form form)
        {
            MercatorUi.Forms.Sig.SigForm sigForm = (MercatorUi.Forms.Sig.SigForm)form;
            List<Control> l = sigForm.FindMovableControlsByType(typeof(MercatorUi.Forms.Sig.SigGrids.ArtLiens));
            if (l.Count == 0)
                return;
            MercatorUi.Forms.Sig.SigGrids.ArtLiens artLiens = (MercatorUi.Forms.Sig.SigGrids.ArtLiens)l[0];
            artLiens.AfterRead += new MercatorUi.MovableControls.MovableGrid.AfterReadHandler(artLiens_AfterRead);
            artLiens.TotalUpdated += new EventHandler(artLiens_TotalUpdated);
            artLiens.CheckBoxValueChanged += new MercatorUi.Forms.Sig.SigGrids.ArtLiens.CheckBoxValueChangedEventHandler(artLiens_CheckBoxValueChanged);
        }

        public void FormClosedCustomize(Form form)
        {
            MercatorUi.Forms.Sig.SigForm sigForm = (MercatorUi.Forms.Sig.SigForm)form;
            List<Control> l = sigForm.FindMovableControlsByType(typeof(MercatorUi.Forms.Sig.SigGrids.ArtLiens));
            if (l.Count == 0)
                return;
            MercatorUi.Forms.Sig.SigGrids.ArtLiens artLiens = (MercatorUi.Forms.Sig.SigGrids.ArtLiens)l[0];
            artLiens.AfterRead -= new MercatorUi.MovableControls.MovableGrid.AfterReadHandler(artLiens_AfterRead);
            artLiens.TotalUpdated -= new EventHandler(artLiens_TotalUpdated);
            artLiens.CheckBoxValueChanged -= new MercatorUi.Forms.Sig.SigGrids.ArtLiens.CheckBoxValueChangedEventHandler(artLiens_CheckBoxValueChanged);
        }

        void artLiens_AfterRead(object sender, EventArgs e)
        {
            MercatorUi.Forms.Sig.SigGrids.ArtLiens artLiens = (MercatorUi.Forms.Sig.SigGrids.ArtLiens)sender;
            MercatorUi.Forms.Sig.SigForm sigForm = (MercatorUi.Forms.Sig.SigForm)artLiens.Form;
            string currentId = sigForm.DataSourceRow["S_ID"].ToString();
            if (artLiens.LastIdFilled != currentId)
                artLiens.FillWithData();
        }

        void artLiens_TotalUpdated(object sender, EventArgs e)
        {
            MercatorUi.Forms.Sig.SigGrids.ArtLiens artLiens = (MercatorUi.Forms.Sig.SigGrids.ArtLiens)sender;
            MercatorUi.Forms.Sig.SigForm sigForm = (MercatorUi.Forms.Sig.SigForm)artLiens.Form;
            if (sigForm.IsFiltring || (artLiens.Grid == null) || (artLiens.Grid.DataSource == null) || (artLiens.Grid.Rows.Count == 0))
                return;

            StringBuilder sbReqSql = new StringBuilder(); // on va construire une requête SQL unique pour l'ensemble des articles de la grille ArtLiens
            foreach (DataGridViewRow dgr in artLiens.Grid.Rows)
            {
                string id_lien = dgr.Cells["id_lien"].Value.ToString();
                if ((id_lien != "") && Convert.ToBoolean(dgr.Cells["ven"].Value))
                {
                    if (sbReqSql.Length == 0)
                        sbReqSql.AppendFormat("(s_id='{0}')", Api.UnquoteSql(id_lien));
                    else
                        sbReqSql.AppendFormat(" or (s_id='{0}')", Api.UnquoteSql(id_lien));
                }
            }
            if (sbReqSql.Length == 0) // la grille ne contient aucun article pour lequel on a coché "V"
                return;
            DataSet ds = Api.Zselect(Globals.RepData, "select s_id,s_prix_ht from stock where " + sbReqSql.ToString());
            if (ds == null)
                return;
            double d = 0;
            foreach (DataGridViewRow dgr in artLiens.Grid.Rows)
            {
                string id_lien = dgr.Cells["id_lien"].Value.ToString();
                if ((id_lien != "") && Convert.ToBoolean(dgr.Cells["ven"].Value))
                {
                    DataRow[] rowsStock = ds.Tables[0].Select(string.Format("s_id='{0}'", Api.UnquoteSql(dgr.Cells["id_lien"].Value.ToString())));
                    if (rowsStock.Length > 0)
                        d += Convert.ToDouble(dgr.Cells["q"].Value) * Convert.ToDouble(rowsStock[0]["s_prix_ht"]);
                }
            }
            Api.SmartReplace(sigForm.DataSourceRow, "S_PRIX_HT", Math.Round(d, MercatorUi.Globals.DEC_DEV_B)); // SmartReplace ne fait réellement le remplacement qui si la valeur est différente
        }

        void artLiens_CheckBoxValueChanged(object sender, MercatorUi.Forms.Sig.SigGrids.ArtLiens.CheckBoxValueChangedEventArgs e)
        {
            if (e.ColumnName == "ven") // on a coché / déc
                artLiens_TotalUpdated(sender, null);
        }

    }
}