package de.oaa.xxx.games.bdsm.entity;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.UUID;

import de.oaa.xxx.games.bdsm.AktiveSperre;
import de.oaa.xxx.games.bdsm.BdsmMitspieler;
import de.oaa.xxx.games.common.aufgaben.Werkzeug;
import jakarta.persistence.CollectionTable;
import jakarta.persistence.Column;
import jakarta.persistence.ElementCollection;
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.FetchType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@Entity
@Table(name = "aktiveSperre")
public class AktiveSperreEntity {

    @Id
    @Column
    private UUID aktiveSperreId;
    @ManyToOne
    @JoinColumn(name = "mitspielerId", nullable = false)
    private MitspielerEntity mitspieler;
    @Column
    private Integer minuten;
    @Column
    private LocalDateTime startzeit;
    @Column
    private LocalDateTime endzeit;
    @Enumerated(EnumType.STRING)
    @ElementCollection(targetClass = Werkzeug.class, fetch = FetchType.EAGER)
    @CollectionTable(name = "aktiveSperre_fuer", joinColumns = @JoinColumn(name = "aktiveSperreId"))
    @Column(name = "werkzeug")
    private List<Werkzeug> fuer = new ArrayList<>();
    @Column
    private String releaseText;
    @ManyToOne
    @JoinColumn(name = "sessionId", nullable = false)
    private BdsmGameEntity session;

    public AktiveSperre toSperre(List<BdsmMitspieler> mitspielerList) {
        AktiveSperre sperre = new AktiveSperre();
        sperre.setAktiveSperreId(aktiveSperreId);
        sperre.setEndzeit(endzeit);
        sperre.setFuer(fuer);
        sperre.setMinuten(minuten);
        sperre.setMitspieler(getMitspielerFromList(mitspielerList, mitspieler.getMitspielerId()));
        sperre.setReleaseText(releaseText);
        sperre.setStartzeit(startzeit);
        return sperre;
    }

    @Override
    public String toString() {
        return "AktiveSperreEntity[id=" + aktiveSperreId + ", mitspieler=" + (mitspieler != null ? mitspieler.getName() : null)
                + ", " + minuten + "min, von=" + startzeit + ", bis=" + endzeit + ", fuer=" + fuer + "]";
    }

    private BdsmMitspieler getMitspielerFromList(List<BdsmMitspieler> mitspielerList, UUID id) {
        Optional<BdsmMitspieler> first = mitspielerList.stream().filter(m -> m.getId().equals(id)).findFirst();
        return first.orElse(null);
    }
}
