using System;
using System.Collections.Generic;
using System.Text;
using MercatorApi;
using MercatorExtensions;
using System.Windows.Forms;
using System.Drawing;
using System.Data;
using System.Runtime.InteropServices;

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

        /*
         * FormLoadCustomize est l'implémentation de l'interface IFormLoadCustomizer.
         * Comme cette méthode reçoit en paramètre un Form (fenêtre de base - car on peut utiliser cette interface pour divers écrans),
         * il faut d'abord effectuer un cast Form -> HistForm
         * Ensuite, on écrit un code qui sera exécuté à la fin de l'évènement Load de HistForm.
         */

        public void FormLoadCustomize(Form WindowsForm)
        {
            MercatorUi.Forms.Hist.HistForm HistForm = (MercatorUi.Forms.Hist.HistForm)WindowsForm;
            HistForm.dataGridView.CellMouseMove += new DataGridViewCellMouseEventHandler(dataGridView_CellMouseMove);
            HistForm.Move += new EventHandler(HistForm_Move);
            HistForm.FormClosing += new FormClosingEventHandler(HistForm_FormClosing);
            form = WindowsForm;
        }

        public void FormClosedCustomize(Form WindowsForm) // il faut se désabonner de tous les events auxquels on s'est abonné dans FormLoadCustomize (donc, il est nécessaire d'implémenter IFormClosedCustomizer)
        {
            MercatorUi.Forms.Hist.HistForm HistForm = (MercatorUi.Forms.Hist.HistForm)WindowsForm;
            HistForm.dataGridView.CellMouseMove -= new DataGridViewCellMouseEventHandler(dataGridView_CellMouseMove);
            HistForm.Move -= new EventHandler(HistForm_Move);
            HistForm.FormClosing -= new FormClosingEventHandler(HistForm_FormClosing);
        }

        private string last_ident = "";
        private Form form;

        void dataGridView_CellMouseMove(object sender, DataGridViewCellMouseEventArgs e)
        {
            IntPtr activeHandle = MercatorWM.WMdll.GetActiveWindow();
            if ((activeHandle == form.Handle) || (activeHandle == MercatorUi.Wait.WaitStatic.CurrentHandle))
            {
                DataGridView dataGridView = (DataGridView)sender;
                if ((e.RowIndex > -1) && (e.ColumnIndex <= 5) && (dataGridView.Rows[e.RowIndex].Cells["piece"].Value != DBNull.Value))
                {
                    string id = dataGridView.Rows[e.RowIndex].Cells["id"].Value.ToString();
                    string journal = dataGridView.Rows[e.RowIndex].Cells["journal"].Value.ToString();
                    Int64 piece = Convert.ToInt64(dataGridView.Rows[e.RowIndex].Cells["piece"].Value);
                    if (last_ident != id + journal + piece.ToString())
                    {
                        Point p = new Point();
                        GetCursorPos(ref p);
                        string s = "<p><strong>" + journal.Trim() + " " + piece.ToString() + "</strong></p>";
                        MercatorSqlParam[] param = new MercatorSqlParam[3]
                            {
                            new MercatorSqlParam ("@id", id, SqlDbType.Char),
                            new MercatorSqlParam ("@journal", journal, SqlDbType.Char),
                            new MercatorSqlParam ("@piece", piece, SqlDbType.Int)
                            };
                        DataSet ds = Api.Zselect(MercatorUi.Globals.RepData, "select top 5 q,designatio from lignes_v (NOLOCK) where (id=@id) and (journal=@journal) and (piece=@piece) and (designatio<>'') order by recno \r\n select count(*) as nbre from lignes_v (NOLOCK) where (id=@id) and (journal=@journal) and (piece=@piece) and (designatio<>'')", param);
                        if (ds != null)
                        {
                            foreach (DataRow dr in ds.Tables[0].Rows)
                            {
                                if (Convert.ToInt32(dr["q"]) == 0)
                                    s += dr["designatio"].ToString().Trim() + "<br />";
                                else
                                    s += Convert.ToInt32(dr["q"]).ToString("### ##0.00").Trim() + " " + dr["designatio"].ToString().Trim() + "<br />";
                            }
                            if (Convert.ToInt32(ds.Tables[1].Rows[0]["nbre"]) > 5)
                                s += "...";
                        }
                        if (s.EndsWith("<br />"))
                            s = s.Substring(0, s.Length - 6);
                        MercatorUi.Wait.WaitStatic.WaitWindowBaseThread(s, p, 3);
                        last_ident = id + journal + piece.ToString();
                    }
                }
            }
        }

        [DllImport("user32.dll")]
        static extern bool GetCursorPos(ref Point lpPoint);

        void HistForm_Move(object sender, EventArgs e)
        {
            MercatorUi.Wait.WaitStatic.WaitClearBaseThread();
        }

        void HistForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            MercatorUi.Wait.WaitStatic.WaitClearBaseThread();
        }
    }
}