using System.Text.Json.Serialization;

namespace PiattaformaStreaming;

[Serializable]
[JsonPolymorphic(TypeDiscriminatorPropertyName = "$type")]
[JsonDerivedType(typeof(Film), "film")]
[JsonDerivedType(typeof(Documentario), "documentario")]
[JsonDerivedType(typeof(SerieTv), "serietv")]
[JsonDerivedType(typeof(Episodio), "episodio")]
public abstract class Media : IRiproducibile, IUguale, IComparable<Media>
{
    private static int cod;

    static Media()
    {
        cod = 0;
    }

    [JsonInclude] public int Codice { get; init; }

    [JsonInclude] public string Titolo { get; private set; }

    private int durata;

    [JsonInclude]
    public virtual int Durata
    {
        get { return durata; }
        private set
        {
            if (value < 0)
                throw new Exception("Durata invalida");
            durata = value;
        }
    }

    private int anno;

    [JsonInclude]
    public int Anno
    {
        get { return anno; }
        private set
        {
            if (value < 1950)
                throw new Exception("Anno invalido");
            anno = value;
        }
    }

    private int valutazione;

    [JsonInclude]
    public int Valutazione
    {
        get { return valutazione; }
        private set
        {
            if (value < 0 || value > 10)
                throw new Exception("Valutazione invalida");
            valutazione = value;
        }
    }

    public Media(string titolo, int durata, int anno, int valutazione)
    {
        Titolo = titolo;
        Durata = durata;
        Anno = anno;
        Valutazione = valutazione;
        Codice = ++cod;
    }

    public abstract string Riproduci();

    public bool Equals(object other)
    {
        return GetType() == other.GetType();
    }

    public int CompareTo(Media other)
    {
        return Durata.CompareTo(other.Durata);
    }


    public virtual string Info()
    {
        return string.Format("Codice: {0}, Titolo: {1}, Durata: {2}, Anno: {3}, Valutazione: {4}",
            Codice, Titolo, Durata, Anno, Valutazione);
    }

    public override string ToString()
    {
        return string.Format("{0}|{1}|{2}|{3}|{4}|{5}", GetType().Name, Codice, Titolo, Durata, Anno, Valutazione);
    }

    #region File Testo

    public Media(string s)
    {
        string[] parti = s.Split("|");
        if (parti.Length < 6)
            throw new Exception("ToString invalido");

        try
        {
            Codice = int.Parse(parti[1]);
            Titolo = parti[2];
            Durata = int.Parse(parti[3]);
            Anno = int.Parse(parti[4]);
            Valutazione = int.Parse(parti[5]);
        }
        catch (Exception ex)
        {
            throw;
        }
    }

    #endregion

    #region File JSON

    public Media() { }

    #endregion
}