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;
import de.stoermer.xxx.domain.xml.Strafe;

public class BestrafungSchablone extends Schablone {

	private Integer level;
	private String text;
	private Integer sekundenVon;
	private Integer sekundenBis;
	
	private List<Werkzeug> benoetigteWerkzeugeBestraftePerson;
	private List<Werkzeug> benoetigteWerkzeugeBestrafendePerson;
	
	public BestrafungSchablone(List<Toy> benoetigteToys) {
		super(benoetigteToys);
		benoetigteWerkzeugeBestraftePerson = new ArrayList<>();
		benoetigteWerkzeugeBestrafendePerson = new ArrayList<>();
	}

	public boolean isAusfuehrbar(Spieler bestraftePerson, Spieler bestrafendePerson, Integer currentLevel) {
		if (currentLevel != level && (currentLevel - 1) != level) {
			return false;
		}
		for (Werkzeug werkzeug : benoetigteWerkzeugeBestraftePerson) {
			if (!bestraftePerson.istVerfuegbar(werkzeug)) {
				return false;
			}
		}
		if (benoetigteWerkzeugeBestrafendePerson.isEmpty()) {
			return true;
		} else {			
			for (Werkzeug werkzeug : benoetigteWerkzeugeBestrafendePerson) {
				if (bestrafendePerson.istVerfuegbar(werkzeug)) {
					return true;
				}
			}
			return false;
		}
	}
	
	public Bestrafung neueBestrafung(Spieler spieler1, Spieler spieler2) {
		Integer timerSekunden = null;
		if (sekundenVon != null) {
			if (sekundenBis != null) {
				timerSekunden = new Random().nextInt(sekundenVon, sekundenBis);
			} else {
				timerSekunden = sekundenVon;
			}
		}
		return new Bestrafung(spieler1, spieler2, text, timerSekunden);
	}
	
	public static BestrafungSchablone fromXml(Strafe xml, List<de.stoermer.xxx.domain.xml.Toy> alle) {
		List<Toy> benoetigt = getBenoetigteToys(alle, xml.getBenoetigteToyIds());		
		BestrafungSchablone schablone = new BestrafungSchablone(benoetigt);
		schablone.level = xml.getLevel() == null ? 1 : xml.getLevel();
		schablone.text = xml.getText();
		schablone.sekundenVon = xml.getSekundenVon();
		schablone.sekundenBis = xml.getSekundenBis();
		if (xml.getBenoetigtBestraftePerson() != null) {
			xml.getBenoetigtBestraftePerson().forEach(werkzeug -> schablone.benoetigteWerkzeugeBestraftePerson.add(Werkzeug.valueOf(werkzeug)));
		}
		if (xml.getBenoetigtBestrafendePerson() != null) {			
			xml.getBenoetigtBestrafendePerson().forEach(werkzeug -> schablone.benoetigteWerkzeugeBestrafendePerson.add(Werkzeug.valueOf(werkzeug)));
		}
		return schablone;
	}
}
