package totale.p240130;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import java.util.Comparator;

public class Catologo {
	
	private TreeSet<Articolo> catalogo = new TreeSet<Articolo>(new Comparator<Articolo>() {
		@Override
		public int compare(Articolo articolo1, Articolo articolo2) {
			// Prezzo non decrescente
			int cmp = Double.compare(articolo1.prezzo(), articolo2.prezzo());
			if (cmp != 0) return cmp;
			// Nome crescente
			cmp = articolo1.nome().compareTo(articolo2.nome());
			if (cmp != 0) return cmp;
			// Ritorna in base al ID
			return articolo1.id().compareTo(articolo2.id());
		}
	});
	
	// Metodo 1
	public boolean add(Articolo art) {
		// Null check
		if (art == null) throw new NullPointerException();
		// Verifica la presenza
		for (Articolo a : catalogo) {
			if (a.equals(art)) return false;
		}
		// Aggiunta
		return catalogo.add(art);
	}
	
	// Metodo 2
	public Articolo cercaArticolo(String cod) {
		// Null check
		if (cod == null) throw new NullPointerException();
		// Ricerca
		for (Articolo a : catalogo) {
			if (a.id().equals(cod)) return a;
		}
		return null;
	}
	
	// Metodo 3
	public boolean cancellaArticolo(String cod) {
		// Null check
		if (cod == null) throw new NullPointerException();
		// Iterator
		Iterator<Articolo> it = catalogo.iterator();
		while (it.hasNext()) {
			Articolo cur = it.next();
			if (!(cur.id().equals(cod))) continue;
			it.remove();
			return true;
		}
		return false;
	}
	
	// Metodo 4
	public List<Articolo> getArticoliSottoPrezzo(Double prezzo) {
		// Null check
		if (prezzo == null) throw new NullPointerException();
		// Creazione dell'oggetto di tipo lista
		List<Articolo> lista = new LinkedList<Articolo>();
		// Controllo sulla size
		if (catalogo.isEmpty()) return lista;
		// Se il catalogo non è empty 
		for (Articolo art : catalogo) {
			Double curPrezzo = art.prezzo();
			if (curPrezzo >= prezzo) break;
			lista.add(art);
		}
		return lista;
	}
	
	// Metodo 5
	public Set<Articolo> ordinaByCodice() {
		Set<Articolo> articoliByCodice = new TreeSet<Articolo>();
		articoliByCodice.addAll(catalogo);
		return articoliByCodice;
	}
}
