<commit_before>﻿using CQRS.Commands.Validators;
using CQRS.Validation;
using SO115App.Models.Classi.Utility;
using SO115App.Models.Servizi.Infrastruttura.GestioneSoccorso;
using System;
using System.Collections.Generic;
using System.Linq;

namespace SO115App.Models.Servizi.CQRS.Commands.GestioneSoccorso.GestionePartenza.ModificaPartenza
{
    public class ModificaPartenzaValidation : ICommandValidator<ModificaPartenzaCommand>
    {
        IGetRichiestaById _getRichiesta;
        public ModificaPartenzaValidation(IGetRichiestaById getRichiesta) => _getRichiesta = getRichiesta;

        public IEnumerable<ValidationResult> Validate(ModificaPartenzaCommand command)
        {
            if (command.ModificaPartenza.CodRichiesta == null || command.ModificaPartenza.CodRichiesta == "")
            {
                yield return new ValidationResult(Costanti.IdRichiestaNonValida);
            }

            if (command.ModificaPartenza.Mezzo == null || command.ModificaPartenza.Mezzo == default || command.ModificaPartenza.Mezzo.Codice == null || command.ModificaPartenza.Mezzo.Codice == "")
            {
                yield return new ValidationResult("Nessun mezzo selezionato");
            }

            if (command.ModificaPartenza.Squadre == null ||
                command.ModificaPartenza.Squadre.Count == 0 ||
                command.ModificaPartenza.Squadre.Any(c => c == null || c == default))
            {
                yield return new ValidationResult("Nessuna squadra selezionata");
            }

            if (command.ModificaPartenza.Squadre.Count != command.ModificaPartenza.Squadre.Distinct().Count())
            {
                yield return new ValidationResult("Hai selezionato più volte la stessa squadra");
            }

            if (command.ModificaPartenza.SequenzaStati != null)
            {
                if (command.ModificaPartenza.SequenzaStati.Any(s => s.Stato == null || s.Stato == "" || s.DataOraAggiornamento == null || s.DataOraAggiornamento == default))
                {
                    yield return new ValidationResult("Cambi stato errati");
                }

                if (command.ModificaPartenza.SequenzaStati.Any(s => s.DataOraAggiornamento > DateTime.Now))
                {
                    yield return new ValidationResult("Non puoi aggiungere un evento non ancora accaduto");
                }

                foreach (var stato in command.ModificaPartenza.SequenzaStati)
                {
                    string messaggioCoerenza = stato.VerificaCoerenza(command.ModificaPartenza.SequenzaStati);

                    if (messaggioCoerenza != null)
                        yield return new ValidationResult(messaggioCoerenza);
                }
            }

            command.Richiesta = _getRichiesta.GetByCodice(command.ModificaPartenza.CodRichiesta);

            if (command.Richiesta == null)
                yield return new ValidationResult(Costanti.IdRichiestaNonValida);
            else if (command.Richiesta.Partenze.Count == 0 && command.ModificaPartenza.Annullamento)
                yield return new ValidationResult("La richiesta non ha partenze da annullare");
            else if (command.Richiesta.Partenze.All(c => c.Partenza.PartenzaAnnullata.Equals(true)))
                yield return new ValidationResult("La richiesta non ha partenze da annullare");

            if (command.Richiesta.Sospesa)
            {
                yield return new ValidationResult("Non puoi modificare una richiesta sospesa");
            }

            if (command.Richiesta.Chiusa)
            {
                yield return new ValidationResult("Non puoi modificare una richiesta chiusa");
            }

            if (command.ModificaPartenza.Annullamento)
            {
                if (command.ModificaPartenza.CodMezzoDaAnnullare == null || command.ModificaPartenza.CodMezzoDaAnnullare == "")
                {
                    yield return new ValidationResult("Nessun codice mezzo selezionato");
                }

                if (command.ModificaPartenza.CodSquadreDaAnnullare == null ||
                    command.ModificaPartenza.CodSquadreDaAnnullare.Count() == 0 ||
                    command.ModificaPartenza.CodSquadreDaAnnullare.Any(c => c == null || c == ""))
                {
                    yield return new ValidationResult("Codici squadre errati");
                }

                if (command.ModificaPartenza.DataAnnullamento == null || command.ModificaPartenza.DataAnnullamento == default)
                {
                    yield return new ValidationResult("Nessuna data annullamento selezionata");
                }

                if (command.ModificaPartenza.DataAnnullamento > command.ModificaPartenza.SequenzaStati.Min(c => c.DataOraAggiornamento))
                {
                    yield return new ValidationResult("La data annullamento non può essere più recente di un cambio stato");
                }

                var ultimoEvento = command.Richiesta.ListaEventi.Max(c => c.Istante);
                
                if (command.ModificaPartenza.DataAnnullamento.Value < ultimoEvento)
                {
                    yield return new ValidationResult("La data annullamento non può essere minore di un evento già accaduto");
                }
            }
        }
    }
}<commit_msg>aggiunti controlli validazione<commit_after>﻿using CQRS.Commands.Validators;
using CQRS.Validation;
using SO115App.Models.Classi.Utility;
using SO115App.Models.Servizi.Infrastruttura.GestioneSoccorso;
using System;
using System.Collections.Generic;
using System.Linq;

namespace SO115App.Models.Servizi.CQRS.Commands.GestioneSoccorso.GestionePartenza.ModificaPartenza
{
    public class ModificaPartenzaValidation : ICommandValidator<ModificaPartenzaCommand>
    {
        IGetRichiestaById _getRichiesta;
        public ModificaPartenzaValidation(IGetRichiestaById getRichiesta) => _getRichiesta = getRichiesta;

        public IEnumerable<ValidationResult> Validate(ModificaPartenzaCommand command)
        {
            if (command.ModificaPartenza.CodRichiesta == null || command.ModificaPartenza.CodRichiesta == "")
            {
                yield return new ValidationResult(Costanti.IdRichiestaNonValida);
            }

            if (command.ModificaPartenza.Mezzo == null || command.ModificaPartenza.Mezzo == default || command.ModificaPartenza.Mezzo.Codice == null || command.ModificaPartenza.Mezzo.Codice == "")
            {
                yield return new ValidationResult("Nessun mezzo selezionato");
            }

            if (command.ModificaPartenza.Squadre == null ||
                command.ModificaPartenza.Squadre.Count == 0 ||
                command.ModificaPartenza.Squadre.Any(c => c == null || c == default))
            {
                yield return new ValidationResult("Nessuna squadra selezionata");
            }

            if (command.ModificaPartenza.Squadre.Count != command.ModificaPartenza.Squadre.Distinct().Count())
            {
                yield return new ValidationResult("Hai selezionato più volte la stessa squadra");
            }

            if (command.ModificaPartenza.SequenzaStati != null)
            {
                if (command.ModificaPartenza.SequenzaStati.Any(s => s.Stato == null || s.Stato == "" || s.DataOraAggiornamento == null || s.DataOraAggiornamento == default))
                {
                    yield return new ValidationResult("Cambi stato errati");
                }

                if (command.ModificaPartenza.SequenzaStati.Any(s => s.DataOraAggiornamento > DateTime.Now))
                {
                    yield return new ValidationResult("Non puoi aggiungere un evento non ancora accaduto");
                }

                foreach (var stato in command.ModificaPartenza.SequenzaStati)
                {
                    string messaggioCoerenza = stato.VerificaCoerenza(command.ModificaPartenza.SequenzaStati);

                    if (messaggioCoerenza != null)
                        yield return new ValidationResult(messaggioCoerenza);
                }
            }

            command.Richiesta = _getRichiesta.GetByCodice(command.ModificaPartenza.CodRichiesta);

            if (command.Richiesta == null)
                yield return new ValidationResult(Costanti.IdRichiestaNonValida);
            else if (command.Richiesta.Partenze.Count == 0 && command.ModificaPartenza.Annullamento)
                yield return new ValidationResult("La richiesta non ha partenze da annullare");
            else if (command.Richiesta.Partenze.All(c => c.Partenza.PartenzaAnnullata.Equals(true)))
                yield return new ValidationResult("La richiesta non ha partenze da annullare");

            if (command.Richiesta.Sospesa)
            {
                yield return new ValidationResult("Non puoi modificare una richiesta sospesa");
            }

            if (command.Richiesta.Chiusa)
            {
                yield return new ValidationResult("Non puoi modificare una richiesta chiusa");
            }

            if (command.ModificaPartenza.Annullamento)
            {
                if (command.ModificaPartenza.CodMezzoDaAnnullare == null || command.ModificaPartenza.CodMezzoDaAnnullare == "")
                {
                    yield return new ValidationResult("Nessun codice mezzo selezionato");
                }

                if (command.ModificaPartenza.CodSquadreDaAnnullare == null ||
                    command.ModificaPartenza.CodSquadreDaAnnullare.Count() == 0 ||
                    command.ModificaPartenza.CodSquadreDaAnnullare.Any(c => c == null || c == ""))
                {
                    yield return new ValidationResult("Codici squadre errati");
                }

                if (command.ModificaPartenza.DataAnnullamento == null || command.ModificaPartenza.DataAnnullamento == default)
                {
                    yield return new ValidationResult("Nessuna data annullamento selezionata");
                }

                if (command.ModificaPartenza.DataAnnullamento > command.ModificaPartenza.SequenzaStati.Min(c => c.DataOraAggiornamento))
                {
                    yield return new ValidationResult("La data annullamento non può essere più recente di un cambio stato");
                }

                var ultimoEvento = command.Richiesta.ListaEventi.Max(c => c.Istante);
                var x = command.ModificaPartenza.DataAnnullamento.Value;
                var dataAnnullamento = new DateTime(x.Year, x.Month, x.Day, x.Hour, x.Minute, x.Second);
                if (dataAnnullamento < ultimoEvento)
                {
                    yield return new ValidationResult("La data annullamento non può essere minore di un evento già accaduto");
                }
            }
        }
    }
}
{'fraction_non_alphanumeric': 0.08400036801913699, 'fraction_numerical': 0.0022081148219707425, 'mean_word_length': 2.096866096866097, 'pattern_counts': {'":': 0, '<': 9, '<?xml version=': 0, '>': 27, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '146953', 'n_tokens_mistral': 3067, 'n_tokens_neox': 2963, 'n_words': 556}