package parziale.p231110;

import java.lang.Integer;

import java.util.Comparator;

import java.util.Collections;

import java.util.List;
import java.util.ArrayList;

import java.util.Set;
import java.util.HashSet;

import java.util.Map;
import java.util.TreeMap;

public class Libreria {
	
	/*
	 * Libreria che rappresenta una libreria 
	 * come una lista di libri senza duplicati e
	 * supporta le seguenti operazioni.
	 */
	
	Set<Libro> libreria = new HashSet<Libro>();
	
	/*
	 * Metodo n.1
	 * inserire nella libreria un nuovo libro, se non è già presente, 
	 * dati in input l’ISBN e l’anno
	 * di pubblicazione;
	 */
	
	public boolean aggiungiLibro(Libro libro) {
		if (libro == null) throw new NullPointerException();
		return libreria.add(libro);
	}
	
	/*
	 * verificare se la libreria contiene un libro, 
	 * dato in input il suo ISBN;
	 */
	
	public boolean contieneLibro(String ISBN) {
		return libreria.contains(new Libro(ISBN, 0));
	}
	
	/*
	 * cancellare dalla libreria un libro, se presente, 
	 * dato in input il suo ISBN;
	 */
	
	public boolean rimuoviLibro(String ISBN) {
		return libreria.remove(new Libro(ISBN, 0));
	}
	
	/*
	 * ordinare la lista dei libri in ordine 
	 * crescente rispetto al codice ISBN;
	 */
	
	public List<Libro> listaOrdinata() {
		List<Libro> listaOrdinata = new ArrayList<Libro>(libreria);
		if (libreria.isEmpty()) return listaOrdinata;
		Collections.sort(listaOrdinata, new Comparator<Libro>() {
			@Override
			public int compare(Libro l1, Libro l2) {
				String ISBN1 = l1.ISBN();
				String ISBN2 = l2.ISBN();
				
				return ISBN1.compareTo(ISBN2);
			}
		});
		return listaOrdinata;
	}
	
	/*
	 * ordinare la lista dei libri in ordine decrescente 
	 * rispetto all’anno di prima pubblicazione;
	 */
	
	public List<Libro> listaOrdinataPerAnnoDec() {
		List<Libro> listaOrdinata = new ArrayList<Libro>(libreria);
		if (libreria.isEmpty()) return listaOrdinata;
		Collections.sort(listaOrdinata, new Comparator<Libro>() {
			@Override
			public int compare(Libro l1, Libro l2) {
				int anno1 = l1.annoPubblicazione();
				int anno2 = l2.annoPubblicazione();
				
				return Integer.compare(anno2, anno1);
			}
		});
		return listaOrdinata;
	}
	
	/*
	 * calcolare restituire in output, per ogni anno di 
	 * pubblicazione compreso tra il 2000 e il 
	 * 2023, il relativo numero di libri contenuti nella libreria.
	 */
	
	public Map<Integer, Integer> numeroLibriTra2000e2023() {
		// Anno Libro (Integer), Numero di occorrenze (Integer)
		Map<Integer, Integer> mappaOrdinata = new TreeMap<Integer, Integer>();
		for (Libro libro : libreria) {
			int anno = libro.annoPubblicazione();
			if (!(anno >= 2000 && anno <= 2023)) continue;
			if (mappaOrdinata.get(anno) == null) mappaOrdinata.put(anno, 1);
			else mappaOrdinata.put(anno, 1 + mappaOrdinata.get(anno));
		}
		return mappaOrdinata;
	}

}
