package de.oaa.xxx.aufgaben;

import java.util.List;
import java.util.UUID;

import de.oaa.xxx.framework.XXXEntity;
import jakarta.persistence.CascadeType;
import jakarta.persistence.Column;
import jakarta.persistence.ElementCollection;
import jakarta.persistence.Entity;
import jakarta.persistence.Enumerated;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.JoinTable;
import jakarta.persistence.ManyToMany;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;

@Entity
@Table(name = "strafe")
public class StrafeEntity implements XXXEntity {

	@Id
	@Column
	private UUID strafeId;
	@Column
	private String kurzText;
	@Column
	private Integer level;
	@Column
	private String text;
	@Column
	private Integer sekundenVon;
	@Column
	private Integer sekundenBis;
	@ManyToOne
	@JoinColumn(name = "gruppeId")
	private AufgabenGruppeEntity aufgabenGruppe;
	@Column
	@Enumerated
	@ElementCollection(targetClass = Werkzeug.class)
	private List<Werkzeug> benoetigtAktiv;
	@Column
	@Enumerated
	@ElementCollection(targetClass = Werkzeug.class)
	private List<Werkzeug> benoetigtPassiv;
	@ManyToMany(cascade = CascadeType.DETACH)
	@JoinTable(name = "strafeToy", joinColumns = { @JoinColumn(name = "strafeId") }, inverseJoinColumns = {
			@JoinColumn(name = "toyId") })
	private List<ToyEntity> benoetigteToys;

	public UUID getStrafeId() {
		return strafeId;
	}

	public void setStrafeId(UUID strafeId) {
		this.strafeId = strafeId;
	}

	public Integer getLevel() {
		return level;
	}

	public void setLevel(Integer level) {
		this.level = level;
	}

	public String getText() {
		return text;
	}

	public void setText(String text) {
		this.text = text;
	}

	public Integer getSekundenVon() {
		return sekundenVon;
	}

	public void setSekundenVon(Integer sekundenVon) {
		this.sekundenVon = sekundenVon;
	}

	public Integer getSekundenBis() {
		return sekundenBis;
	}

	public void setSekundenBis(Integer sekundenBis) {
		this.sekundenBis = sekundenBis;
	}

	public AufgabenGruppeEntity getAufgabenGruppe() {
		return aufgabenGruppe;
	}

	public void setAufgabenGruppe(AufgabenGruppeEntity aufgabenGruppe) {
		this.aufgabenGruppe = aufgabenGruppe;
	}

	public List<Werkzeug> getBenoetigtAktiv() {
		return benoetigtAktiv;
	}

	public void setBenoetigtAktiv(List<Werkzeug> benoetigtAktiv) {
		this.benoetigtAktiv = benoetigtAktiv;
	}

	public List<Werkzeug> getBenoetigtPassiv() {
		return benoetigtPassiv;
	}

	public void setBenoetigtPassiv(List<Werkzeug> benoetigtPassiv) {
		this.benoetigtPassiv = benoetigtPassiv;
	}

	public List<ToyEntity> getBenoetigteToys() {
		return benoetigteToys;
	}

	public void setBenoetigteToys(List<ToyEntity> benoetigteToys) {
		this.benoetigteToys = benoetigteToys;
	}

	public Strafe toStrafe() {
		Strafe strafe = new Strafe();
		strafe.setStrafeId(strafeId);
		strafe.setBenoetigtAktiv(benoetigtAktiv.stream().map(obj -> obj).toList());
		strafe.setBenoetigteToys(benoetigteToys.stream().map(obj -> obj.toToy()).toList());
		strafe.setBenoetigtPassiv(benoetigtPassiv.stream().map(obj -> obj).toList());
		strafe.setGruppeId(aufgabenGruppe.getGruppenId());
		strafe.setKurzText(getKurzText());
		strafe.setLevel(level);
		strafe.setSekundenBis(sekundenBis);
		strafe.setSekundenVon(sekundenVon);
		strafe.setText(text);
		return strafe;
	}
	
	public static StrafeEntity create(Strafe strafe, AufgabenGruppeEntity aufgabenGruppeEntity) {
		StrafeEntity entity = new StrafeEntity();
		entity.setStrafeId(UUID.randomUUID());
		entity.setAufgabenGruppe(aufgabenGruppeEntity);
		entity.setBenoetigtAktiv(strafe.getBenoetigtAktiv());
		entity.setBenoetigteToys(strafe.getBenoetigteToys().stream().map(toy -> ToyEntity.create(toy, aufgabenGruppeEntity)).toList());
		entity.setBenoetigtPassiv(strafe.getBenoetigtPassiv());
		entity.setKurzText(strafe.getKurzText());
		entity.setLevel(strafe.getLevel());
		entity.setSekundenBis(strafe.getSekundenBis());
		entity.setSekundenVon(strafe.getSekundenVon());
		entity.setText(strafe.getText());
		return entity;
	}

	public String getKurzText() {
		return kurzText;
	}

	public void setKurzText(String kurzText) {
		this.kurzText = kurzText;
	}
}
