package de.oaa.xxx.session.entity;

import de.oaa.xxx.session.AktiveSperre;
import de.oaa.xxx.session.Mitspieler;
import de.oaa.xxx.session.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 java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.UUID;

@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 SessionEntity session;

    public UUID getAktiveSperreId() { return aktiveSperreId; }
    public void setAktiveSperreId(UUID aktiveSperreId) { this.aktiveSperreId = aktiveSperreId; }

    public MitspielerEntity getMitspieler() { return mitspieler; }
    public void setMitspieler(MitspielerEntity mitspieler) { this.mitspieler = mitspieler; }

    public Integer getMinuten() { return minuten; }
    public void setMinuten(Integer minuten) { this.minuten = minuten; }

    public LocalDateTime getStartzeit() { return startzeit; }
    public void setStartzeit(LocalDateTime startzeit) { this.startzeit = startzeit; }

    public LocalDateTime getEndzeit() { return endzeit; }
    public void setEndzeit(LocalDateTime endzeit) { this.endzeit = endzeit; }

    public List<Werkzeug> getFuer() { return fuer; }
    public void setFuer(List<Werkzeug> fuer) { this.fuer = fuer; }

    public String getReleaseText() { return releaseText; }
    public void setReleaseText(String releaseText) { this.releaseText = releaseText; }

    public SessionEntity getSession() { return session; }
    public void setSession(SessionEntity session) { this.session = session; }

    public AktiveSperre toSperre(List<Mitspieler> 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;
    }

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