using FluentValidation;
using KarleyLibrary.Erweiterungen;
using System;
using System.Data;
using System.Linq;
using WK5.Core.Models;

namespace WK5.Core.Validators.Verkauf.Lieferscheine
{
    public class LieferscheinValidator : AbstractValidator<Lieferschein>
    {
        public LieferscheinValidator(IValidator<Belegposition> posValidator)
        {
            RuleFor(x => x.Name1)
                .NotEmpty()
                .MaximumLength(60);

            RuleFor(x => x.Name2)
                .MaximumLength(60);

            RuleFor(x => x.Name3)
                .MaximumLength(60);

            RuleFor(x => x.Anrede)
                .MaximumLength(40)
                .ISO88591();

            RuleFor(x => x.Ansprechpartner)
                .MaximumLength(40)
                .ISO88591();

            RuleFor(x => x.Strasse)
                .NotEmpty()
                .MaximumLength(40);

            RuleFor(x => x.Land)
                .NotEmpty()
                .MaximumLength(2)
                .ISO88591();

            RuleFor(x => x.LieferbedingungId)
                .GreaterThan(0);

            RuleFor(x => x.ZahlungsbedingungId)
                .GreaterThan(0);

            RuleFor(x => x.Postleitzahl)
                .NotEmpty()
                .MaximumLength(8);

            RuleFor(x => x.Ort)
                .NotEmpty()
                .MaximumLength(40);

            RuleFor(x => x.Notiz)
                .Must((notiz) => HasNoRtf(notiz))
                .WithMessage("Notiz ist noch im alten Format. Bitte prüfen und korrigieren.");

            RuleFor(x => x.Frachtkosten)
                .GreaterThanOrEqualTo(0);

            RuleFor(x => x.Verpackungskosten)
                .GreaterThanOrEqualTo(0);

            RuleFor(x => x.Versicherungskosten)
                .GreaterThanOrEqualTo(0);            

            RuleFor(x => x.Kopftext)
                .Must((kopftext) => HasNoRtf(kopftext))
                .WithMessage("Kopftext ist noch im alten Format. Bitte prüfen und korrigieren.");

            RuleFor(x => x.Fußtext)
                .Must((fußtext) => HasNoRtf(fußtext))
                .WithMessage("Fußtext ist noch im alten Format. Bitte prüfen und korrigieren.");

            RuleFor(x => x.Positionen)
                .Must((positionen) => positionen.Any())
                .WithMessage("Der Lieferschein muss mindestens über eine Position verfügen.");

            RuleFor(x => x.BestelltDurch)
              .MaximumLength(30)
              .ISO88591();

            RuleFor(x => x.Bestellnummer)
               .MaximumLength(100)
               .ISO88591();

            RuleForEach(x => x.Positionen)
                .SetValidator(posValidator);

            RuleFor(x => x.Lieferzeit)
                .Must((lieferzeit) => HasNoRtf(lieferzeit))
                .WithMessage("Lieferzeit ist noch im alten Format. Bitte prüfen und korrigieren.");

            //RuleFor(x => x.Liefertermin)
            //    .Must((termin) => termin == default(DateTime) ? true : termin >= DateTime.Now.Date)
            //    .WithMessage("Der Liefertermin darf nicht in der Vergangenheit liegen");

            RuleFor(x => x.SpeditionsAuftragsnummer)
                .NotEmpty()
                .NotNull()
                .MaximumLength(60)
                .When(IstLieferbedingungSpedition);
        }


        private bool HasNoRtf(string text)
        {
            return !text.StartsWith(@"{\rtf1");
        }

        private bool IstLieferbedingungSpedition(Beleg beleg)
        {
            using FbController2 fbController = new FbController2();
            fbController.AddParameter("@LIBD_N_NR", beleg.LieferbedingungId);
            DataRow? row = fbController.SelectRow("SELECT * FROM LIEFERBEDINGUNG WHERE LIBD_N_NR = @LIBD_N_NR");
            if (row is null)
            {
                return false;
            }

            Lieferbedingung lieferbedingung = ObjectErweiterung.DataRowZuObjekt(new Lieferbedingung(), row);
            return lieferbedingung.LIBD_L_SPEDITION;
        }
    }
}
