/*! 
 * \file Animal.cs
 * \author Léana Besson
 */
using System.ComponentModel;
using System.Runtime.Serialization;

/*! 
 * \namespace Model
 */
namespace Model
{
    /*! 
     * \class Animal
     * \brief Regroups all properties and functions related to the pet
     */
    [DataContract(Name = "animal")]
    public class Animal : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler? PropertyChanged;

        [DataMember(Name = "nom")]
        public string? Nom
        {
            get => nom;
            set
            {
                if (nom == value)
                    return;
                nom = value;
                NomIsValid = NomValidate(nom);
                OnPropertyChanged(nameof(Nom));
            }
        }
        private string? nom;

        [DataMember(Name = "nomValid")]
        public bool NomIsValid
        {
            get => nomIsValid;
            set
            {
                if (nomIsValid == value)
                    return;
                nomIsValid = value;
                OnPropertyChanged(nameof(NomIsValid));
            }
        }
        private bool nomIsValid;

        [DataMember(Name = "naissance")]

        public DateTime? DateNaissance
        {
            get => dateNaissance;
            set
            {
                if (dateNaissance == value)
                    return;
                dateNaissance = value;
                OnPropertyChanged(nameof(DateNaissance));
            }
        }
        private DateTime? dateNaissance;

        [DataMember(Name = "sexe")]
        public string? Sexe 
        {
            get => sexe;
            set { 
                if (sexe == value) 
                    return; 
                sexe = value;
                OnPropertyChanged(nameof(Sexe));
            }
        }
        private string? sexe;

        [DataMember(Name = "adoption")]

        public DateTime? DateAdoption
        {
            get => dateAdoption;
            set
            {
                if (dateAdoption == value)
                    return;
                dateAdoption = value;
                OnPropertyChanged(nameof(DateAdoption));
            }
        }
        private DateTime? dateAdoption;

        [DataMember(Name = "taille")]
        public float? Taille
        {
            get => taille;
            set
            {
                if (taille == value)
                    return;
                taille = value;
                OnPropertyChanged(nameof(Taille));
            }
        }
        private float? taille;

        [DataMember(Name = "poids")]
        public float? Poids
        {
            get => poids;
            set
            {
                if (poids == value)
                    return;
                poids = value;
                OnPropertyChanged(nameof(Poids));
            }
        }
        private float? poids;

        [DataMember(Name = "alimentation")]
        public string? Alimentation
        {
            get => alimentation;
            set
            {
                if (alimentation == value)
                    return;
                alimentation = value;
                OnPropertyChanged(nameof(Alimentation));
            }
        }
        private string? alimentation;

        [DataMember(Name = "espece")]
        public Espece? Espece
        {
            get => espece;
            set 
            {
                if (espece == value) 
                    return;
                espece = value;
                OnPropertyChanged(nameof(Espece));
            }
        }
        private Espece? espece;

        [DataMember(Name = "race")]
        public Race? Race
        {
            get => race;
            set
            {
                if(race == value) 
                    return;
                race = value;
                OnPropertyChanged(nameof(Race));
            }
        }
        private Race? race;

        [DataMember(Name = "veterinaire")]
        public Veterinaire Veterinaire
        {
            get => veterinaire;
            set
            {
                if(veterinaire == value)
                    return;
                veterinaire = value;
                OnPropertyChanged(nameof(Veterinaire));
            }
        }
        private Veterinaire veterinaire = new Veterinaire();

        [DataMember(Name = "chenil")]
        public Entite Chenil
        {
            get => chenil;
            set
            {
                if (chenil == value)
                    return;
                chenil = value;
                OnPropertyChanged(nameof(Chenil));
            }
        }
        private Entite chenil = new Entite();

        [DataMember(Name = "magasin")]
        public Entite MagasinAlimentaire
        {
            get => magasinAlimentaire;
            set
            {
                if (magasinAlimentaire == value)
                    return;
                magasinAlimentaire = value;
                OnPropertyChanged(nameof(MagasinAlimentaire));
            }
        }
        private Entite magasinAlimentaire = new Entite();

        [DataMember(Name = "provenance")]
        public Entite Provenance
        {
            get => provenance;
            set
            {
                if (provenance == value)
                    return;
                provenance = value;
                OnPropertyChanged(nameof(Petsitter));
            }
        }
        private Entite provenance = new Entite();

        [DataMember(Name = "petsitter")]
        public Entite Petsitter
        {
            get => petsitter;
            set
            {
                if (petsitter == value)
                    return;
                petsitter = value;
                OnPropertyChanged(nameof(Petsitter));
            }
        }
        private Entite petsitter = new Entite() ;

        [DataMember(Name = "image")]
        public string? Image
        {
            get => image;
            set
            {
                if (image == value)
                    return;
                image = value;
                OnPropertyChanged(nameof(Image));
            }
        }
        private string? image;

        /*!
         * \fn Animal()
         * \brief Animal class constructor
         */
        public Animal()
        { 
            Nom = "";
            NomIsValid = false;
            DateNaissance = DateTime.MinValue;
            Sexe = "";
            DateAdoption = DateTime.MinValue;
            Taille = null;
            Poids = null;
            Alimentation = "";
            Espece = null;
            Race = null;
            Image = "";
        }

        /*!
         * \fn OnPropertyChanged(string propertyName)
         * \brief The function checks whether the property has been modified
         * \param propertyName string - Property name modify
         */
        private void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        /*! 
         * \fn NomValidate(string? nom)
         * \brief The function checks if the name is not null, if it has more than 0 letters and if it doesn't start with an empty space
         * \param nom string? - Pet name to be verified
         *  \return bool - Boolean which is false when the name is invalid and true if it is valid
         */
        public bool NomValidate(string? nom)
        {
            if (nom == null || nom.Length <= 0 || nom.StartsWith(" ")) return false;
            return true;
        }
    }
}
