package de.stoermer.xxx.domain;

import java.time.LocalDateTime;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import de.stoermer.xxx.domain.aufgaben.Lock;

public class Spieler {

	private final String name;
	private final Geschlecht geschlecht;
	private final List<Rolle> rollen;
	private final List<Werkzeug> werkzeuge;
	
	private Map<Werkzeug, Lock> currentLocks = new HashMap<>();
	
	public Spieler(String name, Geschlecht geschlecht, List<Rolle> rollen, List<Werkzeug> werkzeuge) {
		this.name = name;
		this.geschlecht = geschlecht;
		this.rollen = Collections.unmodifiableList(rollen);
		this.werkzeuge = Collections.unmodifiableList(werkzeuge);
	}
	
	public String getName() {
		return name;
	}

	public Geschlecht getGeschlecht() {
		return geschlecht;
	}

	public List<Rolle> getRollen() {
		return rollen;
	}

	public boolean istVerfuegbar(Werkzeug werkzeug) {
		return werkzeuge.contains(werkzeug) && currentLocks.entrySet().stream().noneMatch(entry -> werkzeug == entry.getKey());
	}
	
	public List<Werkzeug> wegsperrbareWerkzeuge() {
		return werkzeuge.stream().filter(werkzeug -> currentLocks.entrySet().stream().noneMatch(entry -> werkzeug == entry.getKey())).toList();
	}
	
	public void lock(Lock lock) {
		currentLocks.put(lock.getWerkzeug(), lock);
	}
	
	public List<String> pruefeLocks() {
		List<Lock> unlock = currentLocks.entrySet().stream().filter(entry -> entry.getValue().getReleaseTime().isBefore(LocalDateTime.now())).map(entry -> entry.getValue()).toList();
		unlock.forEach(lock -> currentLocks.remove(lock.getWerkzeug()));
		return unlock.stream().map(lock -> lock.getReleaseText()).toList();
	}
	
	public void lockVerlaengern(int times) {
		currentLocks.entrySet().forEach(entry -> entry.getValue().verlaengern(times));
	}
	
	@Override
	public String toString() {
		return name;
	}
	
	public List<Werkzeug> getWerkzeuge() {
		return werkzeuge;
	}
	
	public Map<Werkzeug, Lock> getCurrentLocks() {
		return currentLocks;
	}
	
	public void logStauts() {
		System.out.println("*---Spielerinfo---*");
		System.out.println("Name: " + name);
		System.out.println("Rollen:");
		rollen.forEach(System.out::println);
		System.out.println("Werkzeuge:");
		werkzeuge.forEach(System.out::println);
		System.out.println("Locks:");
		currentLocks.entrySet().stream().map(entry -> entry.getValue()).forEach(System.out::println);
	}
}
