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

namespace StandManager.Model;

public class ClienteViewModel
{
    public Guid Id { get; set; }
    [Required(ErrorMessage = "La ragione sociale è obbligatoria")]
    public string RagioneSociale { get; set; }
    [Required(ErrorMessage = "La Partita IVA")]
    public string PartitaIva { get; set; }
    public string Cap { get; set; }
    public string Citta { get; set; }
    public string Indirizzo { get; set; }
    public string Email { get; set; }
    public string EmailInvito { get; set; }
    public string NumeroTelefono { get; set; }
    public string NomeAgente { get; set; }
    public string NomeCapoarea { get; set; }
    public Guid? AgenteId { get; set; }
    public UtenteViewModel Agente { get; set; }
    public Guid? CapoareaId { get; set; }
    public UtenteViewModel Capoarea { get; set; }
    public List<DestinazioneViewModel> Destinazioni { get; set; }

    public string Rid { get; set; }
    public TipologiaClienteViewModel TipologiaCliente { get; set; }
    public Guid? TipologiaClienteId { get; set; }
    public ClienteStato StatoCliente { get; set; }
    public int StatoClienteInt { get; set; }
    public string TipologiaGestionale { get; set; }

    public static implicit operator ClienteViewModel(Cliente model)
    {
        return model == null
            ? null
            : new ClienteViewModel()
            {
                NomeAgente = model.Agente?.Nome.ToString(),
                NomeCapoarea = model.Capoarea?.Nome.ToString(),
                Agente = model.Agente,
                AgenteId = model.AgenteId,
                Capoarea = model.Capoarea,
                CapoareaId = model.CapoareaId,
                Cap = model.Cap,
                Citta = model.Citta,
                Email = model.Email,
                EmailInvito = model.EmailInvito,
                Id = model.Id,
                Destinazioni = model.Destinazioni?.Where(x => x.Eliminato == false).Select(x => (DestinazioneViewModel)x).ToList() ?? new List<DestinazioneViewModel>(),
                Indirizzo = model.Indirizzo,
                NumeroTelefono = model.NumeroTelefono,
                PartitaIva = model.PartitaIva,
                RagioneSociale = model.RagioneSociale,
                Rid = model.Rid,
                TipologiaCliente = model.TipologiaCliente,
                TipologiaClienteId = model.TipologiaCliente?.Id ?? Guid.Empty,
                StatoCliente = model.StatoCliente,
                StatoClienteInt = (int)model.StatoCliente,
                TipologiaGestionale = model.TipologiaGestionale
            };
    }

    public Cliente Map(Cliente model)
    {
        model.RagioneSociale = RagioneSociale;
        model.PartitaIva = PartitaIva;
        model.Cap = Cap;
        model.Citta = Citta;
        model.Indirizzo = Indirizzo;
        model.Email = Email;
        model.EmailInvito = EmailInvito;
        model.NumeroTelefono = NumeroTelefono;
        model.Rid = Rid;
        model.StatoCliente = (ClienteStato)StatoClienteInt;
        model.TipologiaGestionale = TipologiaGestionale;

        return model;
    }

    public Destinazione GetDestinazione(Destinazione model)
    {
        model.RagioneSociale = RagioneSociale;
        model.PartitaIva = PartitaIva;
        model.Cap = Cap;
        model.Citta = Citta;
        model.Indirizzo = Indirizzo;
        model.Email = Email;
        model.EmailInvito = EmailInvito;
        model.NumeroTelefono = NumeroTelefono;

        return model;
    }
}

public class TipologiaClienteViewModel
{
    public Guid Id { get; set; }
    public string Nome { get; set; }

    public static implicit operator TipologiaClienteViewModel(TipologiaCliente model)
    {
        return model == null
            ? null
            : new TipologiaClienteViewModel()
            {
                Id = model.Id,
                Nome = model.Nome
            };
    }
}
