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

// <CompileWithRoslyn />

namespace Param
{
    public class Customizer : MercatorUi.ICustomizers.IFormLoadCustomizer, MercatorUi.ICustomizers.IStringUpdater, MercatorUi.ICustomizers.ISqlCommandUpdater
    {
        public void FormLoadCustomize(Form form)
        {
            if (form is MercatorUi.Forms.Param.ParamCategoriesForm paramCategoriesForm) // We zitten in het scherm voor de parameterinstelling van de categorieën
            {
                foreach (MercatorUi.GridPro.DataGridViewXPro grid in paramCategoriesForm.Grids)
                {
                    grid.Columns.Add("colLibLong", "Libellé long");
                    grid.Columns["colLibLong"].Width = 400;
                    grid.Columns["colLibLong"].DataPropertyName = "libLong";
                    grid.Columns["colLibLong"].SortMode = DataGridViewColumnSortMode.NotSortable;
                }
            }
        }

        public string StringUpdate(string stringToModify)
        {
            if (stringToModify.Contains("CAT_STCK"))
            {
                stringToModify = stringToModify.Replace("id,nom", "id,nom,libLong");
            }
            return stringToModify;
        }

        public void SqlCommandUpdate(System.Data.SqlClient.SqlCommand sqlCommandToModify, Form form) // Wijziging van de opdracht voor gegevensopslag
        {
            if (form is MercatorUi.Forms.Param.ParamCategoriesForm paramCategoriesForm) // We zitten wel degelijk in het scherm voor de parameterinstelling van de categorieën
            {
                if (sqlCommandToModify.Parameters.Contains("@type"))
                {
                    if (!sqlCommandToModify.CommandText.Contains("libLong")) // Deze wijziging moet slechts eenmaal worden uitgevoerd. Daarna wordt de gewijzigde opdracht gebruikt voor alle toegevoegde of gewijzigde rijen van het rooster
                    {
                        sqlCommandToModify.CommandText = sqlCommandToModify.CommandText.Replace("nom=@nom", "nom=@nom,libLong=@libLong")
                                                                                       .Replace("id,nom,type)", "id,nom,type,libLong)")
                                                                                       .Replace(",@type)", ",@type,@libLong)");
                    }
                    string id = sqlCommandToModify.Parameters["@id"].Value.ToString(); // We moeten de ID van de rij kennen om de omschrijving te vinden die bij deze rij hoort.
                    string type = sqlCommandToModify.Parameters["@type"].Value.ToString();
                    DataTable dt = (DataTable)paramCategoriesForm.Grids[Int32.Parse(type) - 1].DataSource; // Achter het rooster bevindt zich in feite een DataTable
                    DataRow[] foundRows = dt.Select(string.Format("id='{0}'", Api.UnquoteSql(id))); // De omschrijving zoeken op basis van de ID
                    if (foundRows.Length > 0) // In principe zal altijd voldaan zijn aan deze voorwaarde
                        sqlCommandToModify.Parameters.AddWithValue("@libLong", foundRows[0]["libLong"]); // We voegen de SQL-parameter @libLong met de juiste waarde toe
                }
            }
        }
    }
}