using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Windows.Forms;
using MercatorApi;
using System.ComponentModel;
using System.Linq;


namespace Billing
{
    public class Customizer : MercatorUi.ICustomizers.IBillingEngineCreated, MercatorUi.ICustomizers.IBillingEngineClosed
    {
        public void BillingEngineCreated(MercatorUi.Engine.Gescom.BillingEngine billingEngine)
        {
            billingEngine.BillingFormLoaded += BillingEngine_BillingFormLoaded;
        }

        public void BillingEngineClosed(MercatorUi.Engine.Gescom.BillingEngine billingEngine)
        {
            billingEngine.BillingFormLoaded -= BillingEngine_BillingFormLoaded;
        }

        void BillingEngine_BillingFormLoaded(object sender, EventArgs e)
        {
            MercatorUi.Engine.Gescom.BillingEngine billingEngine = (MercatorUi.Engine.Gescom.BillingEngine)sender;
            if (billingEngine.BillingForm.LinesEditor != null)
            {
                BindingList<MercatorUi._BaseClasses.MercatorComboItem> l = new BindingList<MercatorUi._BaseClasses.MercatorComboItem>();
                foreach (DataRow dr in billingEngine.LIGNES.Rows)
                {
                    string usage = dr["usage"].ToString();
                    if ((usage != "") && !l.Any(p => p.Id == usage))
                        l.Add(new MercatorUi._BaseClasses.MercatorComboItem(usage, usage));
                }
                DevComponents.DotNetBar.Controls.DataGridViewComboBoxExColumn comboCol = new DevComponents.DotNetBar.Controls.DataGridViewComboBoxExColumn();
                comboCol.Name = "usage";
                comboCol.HeaderText = "Usage";
                comboCol.DataPropertyName = "usage";
                comboCol.DisplayMember = "Description";
                comboCol.ValueMember = "Id";
                comboCol.DataSource = l;
                comboCol.Width = 100;
                comboCol.DropDownStyle = ComboBoxStyle.DropDownList;
                billingEngine.BillingForm.LinesEditor.Grid.Columns.Add(comboCol);
                billingEngine.BillingForm.LinesEditor.Grid.EditingControlShowing += Grid_EditingControlShowing;
                billingEngine.BillingForm.LinesEditor.Grid.Disposed += Grid_Disposed;
            }
        }

        private void Grid_Disposed(object sender, EventArgs e)
        {
            MercatorUi.GridPro.DataGridViewXPro grid = (MercatorUi.GridPro.DataGridViewXPro)sender;
            grid.EditingControlShowing -= Grid_EditingControlShowing;
            grid.Disposed -= Grid_Disposed;
        }

        void Grid_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
        {
            MercatorUi.GridPro.DataGridViewXPro grid = (MercatorUi.GridPro.DataGridViewXPro)sender;
            if ((e.Control is DevComponents.DotNetBar.Controls.ComboBoxEx) && (grid.Columns[grid.CurrentCell.ColumnIndex].Name == "usage"))
            {
                DevComponents.DotNetBar.Controls.DataGridViewComboBoxExColumn comboCol = (DevComponents.DotNetBar.Controls.DataGridViewComboBoxExColumn)grid.Columns[grid.CurrentCell.ColumnIndex];
                BindingList<MercatorUi._BaseClasses.MercatorComboItem> listOnCol = (BindingList<MercatorUi._BaseClasses.MercatorComboItem>)comboCol.DataSource;


                DevComponents.DotNetBar.Controls.ComboBoxEx combo = (DevComponents.DotNetBar.Controls.ComboBoxEx)e.Control;
                string id_article = grid.CurrentRow.Cells["id_article"].Value.ToString();
                List<MercatorUi._BaseClasses.MercatorComboItem> l = new List<MercatorUi._BaseClasses.MercatorComboItem>();
                if (id_article != "")
                {
                    MercatorUi.Forms.Billing.BillingForm billingForm = (MercatorUi.Forms.Billing.BillingForm)grid.FindForm();
                    foreach (string s in billingForm.BillingEngine.StockRecords[id_article].S_USAGES.Split(new char[2] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries))
                    {
                        l.Add(new MercatorUi._BaseClasses.MercatorComboItem(s, s));
                        if (!listOnCol.Any(p => p.Id == s))
                            listOnCol.Add(new MercatorUi._BaseClasses.MercatorComboItem(s, s));
                    }
                    l.Add(new MercatorUi._BaseClasses.MercatorComboItem("", "")); // ajouter un élément vide dans le combo
                }
                combo.DataSource = l;
            }
        }
    }
}