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

namespace SigStock
{
    public class Customizer : MercatorUi.ICustomizers.IFormLoadCustomizer
                            , MercatorUi.ICustomizers.IFormClosedCustomizer
                            , MercatorUi.ICustomizers.IStringUpdater
    {
        public string StringUpdate(string stringToModify) // Wijziging van de opdracht van het beschikbaarheidsrooster om rekening te houden met een nieuwe kolom.
        {
            if (Api.StrExtract(stringToModify, "<ID>", "</ID>") == "STOCKDISPO") // Dit laat toe enkel de opdracht van het beschikbaarheidsrooster te wijzigen, en niet de opdrachten van de andere roosters van het informatiebestand "Artikels"
            {
                stringToModify = stringToModify.Replace("dispo.stockmax,", "dispo.stockmax,dispo.loc,dispo.loc as loc_old,")
                                               .Replace("sum(stockmax),", "sum(stockmax),'','',");
            }
            return stringToModify;
        }

        public void FormLoadCustomize(Form form)
        {
            MercatorUi.Forms.Sig.SigForm sigForm = (MercatorUi.Forms.Sig.SigForm)form;
            MercatorUi.Forms.Sig.SigGrids.StockDispo stockDispo = sigForm.MovableControls.Values.OfType<MercatorUi.Forms.Sig.SigGrids.StockDispo>().FirstOrDefault();
            if (stockDispo != null)
            {
                stockDispo.AfterColumnsCreated += StockDispo_AfterColumnsCreated;
                stockDispo.AfterWrite += StockDispo_AfterWrite;
            }
        }

        public void FormClosedCustomize(Form form)
        {
            MercatorUi.Forms.Sig.SigForm sigForm = (MercatorUi.Forms.Sig.SigForm)form;
            MercatorUi.Forms.Sig.SigGrids.StockDispo stockDispo = sigForm.MovableControls.Values.OfType<MercatorUi.Forms.Sig.SigGrids.StockDispo>().FirstOrDefault();
            if (stockDispo != null)
            {
                stockDispo.AfterColumnsCreated -= StockDispo_AfterColumnsCreated;
                stockDispo.AfterWrite -= StockDispo_AfterWrite;
            }
        }

        private void StockDispo_AfterColumnsCreated(object sender, EventArgs e) // De kolom "Lokalisatie" toevoegen
        {
            MercatorUi.Forms.Sig.SigGrids.StockDispo stockDispo = (MercatorUi.Forms.Sig.SigGrids.StockDispo)sender;
            stockDispo.Grid.Columns.Add("loc", _Divers.Iif_langue(Globals.Langue, "Localisation", "Lokalisatie", "Localisation"));
            stockDispo.Grid.Columns["loc"].Width = 85;
            stockDispo.Grid.Columns["loc"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
            stockDispo.Grid.Columns["loc"].DataPropertyName = "loc";
            stockDispo.Grid.AddInvisibleColumn("loc_old");
        }

        private void StockDispo_AfterWrite(object sender, EventArgs e) // Om de wijzigingen aan de nieuwe kolom in de DB in te voeren
        {
            MercatorUi.Forms.Sig.SigGrids.StockDispo stockDispo = (MercatorUi.Forms.Sig.SigGrids.StockDispo)sender;
            MercatorUi.Forms.Sig.SigForm sigForm = (MercatorUi.Forms.Sig.SigForm)stockDispo.Form;
            if (stockDispo.LastIdFilled == sigForm.DataSourceRow["s_id"].ToString())
            {
                using (SqlCommand cmd = new SqlCommand("update dispo set loc = @loc where id_stock = @id_stock and id_magasin = @id_magasin"))
                {
                    foreach (DataGridViewRow row in stockDispo.Grid.Rows)
                    {
                        if (row.Cells["loc"].Value.ToString().TrimEnd() != row.Cells["loc_old"].Value.ToString().TrimEnd())
                        {
                            cmd.Parameters.Clear();
                            cmd.Parameters.Add(new SqlParameter("@id_stock", SqlDbType.Char)).Value = sigForm.DataSourceRow["s_id"].ToString();
                            cmd.Parameters.Add(new SqlParameter("@id_magasin", SqlDbType.Char)).Value = row.Cells["id"].Value;
                            cmd.Parameters.Add(new SqlParameter("@loc", SqlDbType.Char)).Value = row.Cells["loc"].Value;
                            Api.SqlExec(Globals.RepData, cmd);
                        }
                    }
                }
            }
        }
    }
}