package OnlineShop.domain;

import java.io.FileNotFoundException;
import java.util.*;
import OnlineShop.domain.ExceptionsKlassen.*;

public class Kaufhalle {
	private ArrayList<Produkt> produkte;
	private ArrayList<Bestellung> bestellungen;
	private Kunde kunde;
	private Bestellung akteulleBestellung;

	public Kaufhalle() throws FileNotFoundException {
		this.produkte = new ArrayList<>();
		this.kunde = new Kunde();
		this.bestellungen = new ArrayList<>();
	}

	public boolean produkteLadenImSystem() throws FileNotFoundException {
		return produkteLaden.produkteLaden(produkte);
	}

	public boolean addProduktZuWarenkorb(String Produktname, int menge)
			throws ProduktNichtGefundenException, Exception {
		Produkt neueProdukt = findeProduktImKaufhalle(Produktname);
		if (neueProdukt == null)
			throw new ProduktNichtGefundenException("Produkt ist nicht Verfügbar!");

		if (menge > neueProdukt.getBestand())
			throw new Exception("Wir haben nicht genug Produktmenge im Lager!");

		WarenkorbMenge wp = kunde.getWarenKorb().findWarenkorbMenge(Produktname);
		if (wp != null)
			wp.setMenge(wp.getMenge() + menge);

		else {
			WarenkorbMenge neueWarenkorbMenge = new WarenkorbMenge();
			neueWarenkorbMenge.addProdukt(neueProdukt, menge);
			kunde.getWarenKorb().addProdukt(neueWarenkorbMenge);
		}

		neueProdukt.setBestand(neueProdukt.getBestand() - menge);

		return true;
	}

	public boolean mengeaendern(String Produktname, int menge) throws ProduktNichtGefundenException {
		WarenkorbMenge akteulleProdukt = kunde.getWarenKorb().findWarenkorbMenge(Produktname);

		if (akteulleProdukt == null)
			throw new ProduktNichtGefundenException("Sie haben das Produkt nicht in Ihrem Warenkorb");

		if (menge > akteulleProdukt.getProdukt().getBestand())
			throw new ProduktNichtGefundenException("Wir haben nicht genug Produktmenge im Lager!");

		akteulleProdukt.setMenge(menge);
		akteulleProdukt.getProdukt().setBestand(akteulleProdukt.getProdukt().getBestand() - menge);
		return true;
	}

	public boolean loescheProdukt(String Produktname) throws ProduktNichtGefundenException {
		WarenkorbMenge produktToBERemoved = kunde.getWarenKorb().findWarenkorbMenge(Produktname);

		if (produktToBERemoved == null)
			throw new ProduktNichtGefundenException("Sie haben das Produkt nicht in Ihrem Warenkorb");

		return kunde.getWarenKorb().getProdukte().remove(produktToBERemoved);
	}

	public boolean bestellen() throws ProduktNichtGefundenException {
		if (kunde.getWarenKorb().getProdukte().size() == 0)
			throw new ProduktNichtGefundenException("Sie haben das Produkt nicht in Ihrem Warenkorb");

		akteulleBestellung = new Bestellung(kunde.getWarenKorb().getProdukte(), kunde.getName());
		akteulleBestellung.getKosten();
		akteulleBestellung.getVersandKosten();
		kunde.getWarenKorb().getProdukte().clear();

		return true;
	}

	public boolean speichereBestellung() {
		this.akteulleBestellung.setDate(new Date());
		bestellungen.add(akteulleBestellung);
		return true;
	}

	public boolean loginKunde(String name, String anschrift) throws LeereEingabeException {

		if (name.isEmpty() || anschrift.isEmpty())
			throw new LeereEingabeException("Sie müssen Name sowie anschrift eingeben");

		kunde.setName(name);
		kunde.setAnschrift(anschrift);
		return true;
	}

	private Produkt findeProduktImKaufhalle(String Produktname) {

		for (Produkt p : produkte)
			if (p.getName().equalsIgnoreCase(Produktname))
				return p;

		return null;
	}

	public ArrayList<String> zeigeProdukte() {
		ArrayList<String> allProdukte = new ArrayList<>();
		int index = 1;
		for (Produkt p : produkte)
			allProdukte.add(index++ + ".Produkt: " + p.toString());

		return allProdukte;
	}

}
