namespace Pr19;

public class Libreria
{
    private List<Libro> libri;

    public Libreria()
    {
        libri = new List<Libro>();
    }
    
    public void AggiungiLibro(Libro libro)
    {
        if (!libri.Any(x => x.Isbn == libro.Isbn))
            libri.Add(libro);
    }
    public void AggiungiRomanzo(string isbn, string titolo, string autore, string genere, double prezzoCopertina)
    {
        AggiungiLibro(new Romanzo(isbn, titolo, autore, genere, prezzoCopertina));
    }
    public void AggiungiManuale(string isbn, string titolo, string autore, string materia, int pagine, double prezzoCopertina)
    {
        AggiungiLibro(new Manuale(isbn, titolo, autore, materia, pagine, prezzoCopertina));
    }
    public void AggiungiLibroDiTesto(string isbn, string titolo, string autore, string materia, string adottato, string volume, double prezzoCopertina)
    {
        AggiungiLibro(new LibroDiTesto(isbn, titolo, autore, materia, adottato, volume, prezzoCopertina));
    }

    public double PrezzoVendita(string isbn)
    {
        Libro libro = libri.Find(x => x.Isbn == isbn);
        if (libro != null)
            return libro.PrezzoVendita();
        else
            return -1;
    }

    public bool EliminaLibro(string isbn)
    {
        return libri.Remove(libri.Find(x => x.Isbn == isbn));
    }

    public void OrdinaPerAutoreTitolo()
    {
        libri.Sort((x, y) =>
            x.Autore.Equals(y.Autore)
                ? x.Titolo.CompareTo(y.Titolo)
                : x.Autore.CompareTo(y.Autore));
    }

    public void OrdinaPerGenere()
    {
        libri.Sort((x, y) =>
        {
            if (x is Romanzo && y is Romanzo)
                return (x as Romanzo).Genere.CompareTo((y as Romanzo).Genere);
            else
                return 0;
        });
    }
    
    public string StampaNumeroPerTipo()
    {
        int nRomanzi = 0;
        int nManuali = 0;
        int nLibriTesto = 0;

        foreach (Libro libro in libri)
        {
            switch (libro)
            {
                case Romanzo:
                    nRomanzi++;
                    break;
                case Manuale:
                    nManuali++;
                    break;
                case LibroDiTesto:
                    nLibriTesto++;
                    break;
            }
        }

        return String.Format(
            "Numero Romanzi: {0}\n" +
            "Numero Manuali: {1}\n" +
            "Numero Libri di testo: {2}\n", nRomanzi, nManuali, nLibriTesto);
    }

    public string StampaLibreria()
    {
        string s = String.Empty;
        foreach (Libro libro in libri)
        {
            s += libro.ToString() + "\n";
        }
        return s;
    }
}