package de.stoermer.xxx.domain.aufgaben;

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

import de.stoermer.xxx.domain.Spieler;
import de.stoermer.xxx.domain.Toy;
import de.stoermer.xxx.domain.Werkzeug;

public class BeglueckungSchablone extends Schablone {

	private Integer level;
	private String text;
	private Integer sekundenVon;
	private Integer sekundenBis;

	private List<Werkzeug> benoetigteWerkzeugeBegluecktePerson;
	private List<Werkzeug> benoetigteWerkzeugeBeglueckendePerson;
	
	public BeglueckungSchablone(List<Toy> benoetigteToys) {
		super(benoetigteToys);
		this.benoetigteWerkzeugeBeglueckendePerson = new ArrayList<>();
		this.benoetigteWerkzeugeBegluecktePerson = new ArrayList<>();
	}

	public boolean isAusfuehrbar(Spieler begluecktePerson, Spieler beglueckendePerson, int currentLevel) {
		if (currentLevel != level  && (currentLevel - 1) != level) {
			return false;
		}
		for (Werkzeug werkzeug : benoetigteWerkzeugeBegluecktePerson) {
			if (!begluecktePerson.istVerfuegbar(werkzeug)) {
				return false;
			}
		}
		if (benoetigteWerkzeugeBeglueckendePerson.isEmpty()) {
			return true;
		} else {			
			for (Werkzeug werkzeug : benoetigteWerkzeugeBeglueckendePerson) {
				if (beglueckendePerson.istVerfuegbar(werkzeug)) {
					return true;
				}
			}
			return false;
		}
	}
	
	public Beglueckung beglueckungAusSchablone(Spieler begluecktePerson, Spieler beglueckendePerson) {
		Integer timerSekunden = null;
		if (sekundenVon != null) {
			if (sekundenBis != null) {
				timerSekunden = new Random().nextInt(sekundenVon, sekundenBis);
			} else {
				timerSekunden = sekundenVon;
			}
		}
		return new Beglueckung(begluecktePerson, beglueckendePerson, text, timerSekunden);
	}
	
	public static BeglueckungSchablone fromXml(de.stoermer.xxx.domain.xml.Beglueckung xml, List<de.stoermer.xxx.domain.xml.Toy> alle) {
		List<Toy> benoetigt = getBenoetigteToys(alle, xml.getBenoetigteToyIds());		
		BeglueckungSchablone schablone = new BeglueckungSchablone(benoetigt);
		schablone.level = xml.getLevel() == null ? 1 : xml.getLevel();
		schablone.text = xml.getText();
		schablone.sekundenVon = xml.getSekundenVon();
		schablone.sekundenBis = xml.getSekundenBis();
		if (xml.getBenoetigteBegluecktePerson() != null) {
			xml.getBenoetigteBegluecktePerson().forEach(werkzeug -> schablone.benoetigteWerkzeugeBegluecktePerson.add(Werkzeug.valueOf(werkzeug)));
		}
		if (xml.getBenoetigteBeglueckendePerson() != null) {			
			xml.getBenoetigteBeglueckendePerson().forEach(werkzeug -> schablone.benoetigteWerkzeugeBeglueckendePerson.add(Werkzeug.valueOf(werkzeug)));
		}
		return schablone;
	}
}
