using StandManager.Domain.Entita;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace StandManager.Model;
public class IscrizioneEventoViewModel
{
    public Guid Id { get; set; }
    public EventoViewModel Evento { get; set; }
    public InvitoEvento InvitoEvento { get; set; }
    public ClienteViewModel Cliente { get; set; }
    public Guid? ClienteId { get; set; }
    public Guid? DestinazioneId { get; set; }
    [Range(1, int.MaxValue, ErrorMessage = "Inserire un numero di partecipanti valido")]
    public int Partecipanti { get; set; }

    public string? Note { get; set; }
    public bool ScanCompleto { get; set; }
    public DateTime? DataScan { get; set; }
    [Required(ErrorMessage = "Il nome è obbigatorio")]
    public string Nome { get; set; }
    [Required(ErrorMessage = "Il cognome è obbigatorio")]
    public string Cognome { get; set; }
    [Required(ErrorMessage = "La E-mail è obbigatoria")]
    public string Email { get; set; }
    [Required(ErrorMessage = "Il numero di telefono è obbigatorio")]
    public string NumeroTelefono { get; set; }
    [Required(ErrorMessage = "La provincia è obbigatoria")]
    public Guid? Provincia { get; set; }
    [Required(ErrorMessage = "Il comune è obbigatorio")]
    public Guid? Comune { get; set; }
    [Required(ErrorMessage = "Il CAP è obbigatorio")]
    public string Cap { get; set; }
    [Required(ErrorMessage = "La Ragione Sociale è obbigatoria")]
    public string RagioneSociale { get; set; }
    [Required(ErrorMessage = "Il campo è obbigatorio")]
    public string EsperienzaConDAC { get; set; }
    [Required(ErrorMessage = "La tipologia è obbigatoria")]
    public Guid? TipologiaClienteId {  get; set; }
    public RuoloTipo Ruolo { get; set; }
    [Required(ErrorMessage = "Il ruolo è obbigatorio")]
    public int? RuoloInt { get; set; }
    public string? PartitaIva { get; set; }
    [Required(ErrorMessage = "E' necessario indicare la data di partecipazione")]
    public DateTime? GiornoPresenza { get; set; }

    public IscrizioneEvento Map(IscrizioneEvento model)
    {
        model.Partecipanti = Partecipanti;
        model.Note = Note;
        model.ScanCompleto = ScanCompleto;
        model.DataScan = DataScan;
        model.Nome = Nome;
        model.Cognome = Cognome;
        model.Email = Email;
        model.NumeroTelefono = NumeroTelefono;
        model.Cap = Cap;
        model.RagioneSociale = RagioneSociale;
        model.EsperienzaConDAC = EsperienzaConDAC;
        model.PartitaIva = PartitaIva;
        model.GiornoPresenza = GiornoPresenza.Value;
        model.ComuneId = Comune.GetValueOrDefault();
        model.ProvinciaId = Provincia.GetValueOrDefault();

        return model;
    }

    public static implicit operator IscrizioneEventoViewModel(IscrizioneEvento model)
    {
        return model == null
            ? null
            : new IscrizioneEventoViewModel()
            {
                Id = model.Id,
                InvitoEvento = model.InvitoEvento,
                DestinazioneId = model.DestinazioneId,
                ClienteId = model.Cliente?.Id,
                Partecipanti = model.Partecipanti,
                Note = model.Note,
                ScanCompleto = model.ScanCompleto,
                DataScan = model.DataScan,
                Nome = model.Nome,
                Cognome = model.Cognome,
                Email = model.Email,
                NumeroTelefono = model.NumeroTelefono,
                Provincia = model.Provincia?.Id ?? Guid.Empty,
                Comune = model.Comune?.Id ?? Guid.Empty,
                Cap = model.Cap,
                RagioneSociale = model.RagioneSociale,
                EsperienzaConDAC = model.EsperienzaConDAC,
                TipologiaClienteId = model.TipologiaClienteId,
                Ruolo = model.Ruolo,
                RuoloInt = (int?)model.Ruolo,
                PartitaIva = model.PartitaIva,
                GiornoPresenza = model.GiornoPresenza,
            };
    }

}
