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.Windows.Forms;
using System.Threading.Tasks;

namespace SigCli
{
    public class Customizer : MercatorUi.ICustomizers.IFormValidateCustomizer
    {
        public bool FormValidateCustomize(Form form)
        {
            MercatorUi.Forms.Sig.SigForm sigForm = (MercatorUi.Forms.Sig.SigForm)form;
            
            if ((string.IsNullOrWhiteSpace(sigForm.CliRecord.C_PAYS))
            || sigForm.CliRecord.C_PAYS.StartsWith("BE", StringComparison.InvariantCultureIgnoreCase))
            {
                // il devrait s'agir d'un client en Belgique
                if (string.IsNullOrWhiteSpace(sigForm.CliRecord.C_CODEP))
                {
                    Dialogs.Stop("Le code postal est vide !");
                    var textBoxCp = sigForm.MovableControls.Values.OfType<MercatorUi.MovableControls.MovableTextBox>()
                                                .Where(p => p.Source == "C_CODEP").FirstOrDefault();
                    if (textBoxCp != null)
                        MercatorUi._Divers.FocusError(textBoxCp);
                    return false;
                }
                var task = Task.Run(async () =>
                    await MercatorController.xFunctions.xAddressesStreetsByPostalCode(MercatorUi.Globals.Langue, sigForm.CliRecord.C_CODEP));
                var allStreetsByPostalCodeRecords = task.Result;
                if (allStreetsByPostalCodeRecords == null)
                {
                    MercatorUi.Dialogs.Stop("Erreur lors de la récupération des noms de rue : "
                                + (MercatorController.xFunctions.xAddressesLastError ?? "erreur inconnue")
                                + "\r\nImpossible d'effectuer la vérification !");
                }
                else
                {
                    string adresse = sigForm.CliRecord.C_ADRESSE;
                    if (!allStreetsByPostalCodeRecords.Where(p => adresse.StartsWith(p.street, StringComparison.InvariantCultureIgnoreCase)).Any()
                        && !Dialogs.AnswerYesNo($"Aucune rue \"{adresse}\" ne paraît exister.\r\nContinuer ?"))
                    {
                        var textBoxAd = sigForm.MovableControls.Values.OfType<MercatorUi.MovableControls.MovableTextBox>()
                                                   .Where(p => p.Source == "C_ADRESSE").FirstOrDefault();
                        if (textBoxAd != null)
                            MercatorUi._Divers.FocusError(textBoxAd);
                        return false;
                    }
                }
            }
            return true;
        }

    }
}