using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Linq;
using MercatorApi;
using MercatorExtensions;
using MercatorUi;
using MercatorDatabase;
using System.Xml;
using MercatorUi.Forms.Other.OtherClasses;

// <CompileWithRoslyn />

namespace PeppolBox
{
    public class Customizer : MercatorUi.ICustomizers.IPeppolBoxHelperCreated, MercatorUi.ICustomizers.IPeppolBoxHelperClosed
    {
        private MercatorUi._BaseClasses.ComboBoxExReadOnly comboFilter;

        public void PeppolBoxHelperCreated(PeppolBoxHelper peppolBoxHelper)
        {
            peppolBoxHelper.Downloading += PeppolBoxHelper_Downloading;
            if (peppolBoxHelper.PeppolBoxForm != null)
            {
                List<MercatorUi._BaseClasses.MercatorComboItem> l = new List<MercatorUi._BaseClasses.MercatorComboItem>
                {
                    new MercatorUi._BaseClasses.MercatorComboItem("Company A", "0453917888"),
                    new MercatorUi._BaseClasses.MercatorComboItem("Company B", "0453917999"),
                };
                comboFilter = new MercatorUi._BaseClasses.ComboBoxExReadOnly
                {
                    DisplayMember = "Description",
                    ValueMember = "Id",
                    DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed,
                    DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList,
                    FormattingEnabled = true,
                    ItemHeight = 14,
                    Location = new System.Drawing.Point(10, 5),
                    Name = "comboFilter",
                    Size = new System.Drawing.Size(100, 20),
                    Style = DevComponents.DotNetBar.eDotNetBarStyle.StyleManagerControlled,
                    TabIndex = 0,
                    Tag = peppolBoxHelper
                };
                comboFilter.DataSource = l;
                comboFilter.SelectedValueChanged += ComboFilter_SelectedValueChanged;

                peppolBoxHelper.PeppolBoxForm.DrawLineBelowCaption = true;
                peppolBoxHelper.PeppolBoxForm.PanelTop.Height = 30;
                peppolBoxHelper.PeppolBoxForm.PanelTop.Visible = true;
                peppolBoxHelper.PeppolBoxForm.PanelTop.Controls.Add(comboFilter);
            }
            FilterMessages(peppolBoxHelper);
        }

        public void PeppolBoxHelperClosed(PeppolBoxHelper peppolBoxHelper)
        {
            peppolBoxHelper.Downloading -= PeppolBoxHelper_Downloading;
            if (comboFilter != null)
            {
                comboFilter.SelectedValueChanged -= ComboFilter_SelectedValueChanged;
                comboFilter.Dispose();
            }
        }

        private void ComboFilter_SelectedValueChanged(object sender, EventArgs e)
        {
            PeppolBoxHelper peppolBoxHelper = (PeppolBoxHelper)comboFilter.Tag;
            FilterMessages(peppolBoxHelper);
        }

        private void PeppolBoxHelper_Downloading(object sender, PeppolBoxHelper.DownloadingEventArgs e)
        {
            PeppolBoxHelper peppolBoxHelper = (PeppolBoxHelper)sender;
            FilterMessages(peppolBoxHelper);
        }

        private bool filterApplied;

        private void FilterMessages(PeppolBoxHelper peppolBoxHelper)
        {
            if (comboFilter?.SelectedValue != null)
            {
                if (filterApplied)
                {
                    peppolBoxHelper.Messages.RestoreAllMessages();
                    filterApplied = false;
                }
                foreach (PeppolBoxHelper.PeppolMessage message in peppolBoxHelper.Messages.Where(m => !string.IsNullOrEmpty(m.PeppolId)).ToArray())
                {
                    if (!message.PeppolId.Contains(comboFilter.SelectedValue.ToString()))
                    {
                        peppolBoxHelper.Messages.Remove(message);
                        filterApplied = true;
                    }
                }
            }
        }
    }
}