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

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

import de.oaa.xxx.games.bdsm.GeschlechtEnum;
import de.oaa.xxx.games.bdsm.BdsmMitspieler;
import de.oaa.xxx.games.bdsm.RolleEnum;
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.OneToMany;
import jakarta.persistence.Table;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@Entity
@Table(name = "mitspieler")
public class MitspielerEntity {

    @Id
    @Column
    private UUID mitspielerId;
    @Column
    private UUID userId;
    @Column
    private boolean eigenesGeraet;
    @Column
    private String name;
    @Enumerated(EnumType.STRING)
    @Column
    private GeschlechtEnum geschlecht;
    @Enumerated(EnumType.STRING)
    @ElementCollection(targetClass = Werkzeug.class, fetch = FetchType.EAGER)
    @CollectionTable(name = "mitspieler_werkzeuge", joinColumns = @JoinColumn(name = "mitspielerId"))
    @Column(name = "werkzeug")
    private List<Werkzeug> werkzeuge = new ArrayList<>();
    @Enumerated(EnumType.STRING)
    @ElementCollection(targetClass = GeschlechtEnum.class, fetch = FetchType.EAGER)
    @CollectionTable(name = "mitspieler_spieltMit", joinColumns = @JoinColumn(name = "mitspielerId"))
    @Column(name = "geschlecht")
    private List<GeschlechtEnum> spieltMit = new ArrayList<>();
    @Enumerated(EnumType.STRING)
    @ElementCollection(targetClass = RolleEnum.class, fetch = FetchType.EAGER)
    @CollectionTable(name = "mitspieler_rollen", joinColumns = @JoinColumn(name = "mitspielerId"))
    @Column(name = "rolle")
    private List<RolleEnum> rollen = new ArrayList<>();
    @Column(nullable = false, columnDefinition = "BOOLEAN DEFAULT true")
    private boolean sperrenVorFinaleAufloesen = true;
    @ManyToOne
    @JoinColumn(name = "sessionId", nullable = false)
    private BdsmGameEntity session;
    @OneToMany(mappedBy = "mitspieler", fetch = FetchType.EAGER)
    private List<AktiveSperreEntity> aktiveSperren = new ArrayList<>();

    @Override
    public String toString() {
        return "MitspielerEntity[mitspielerId=" + mitspielerId + ", name=" + name
                + ", geschlecht=" + geschlecht + ", rollen=" + rollen + ", werkzeuge=" + werkzeuge + "]";
    }

    public BdsmMitspieler toMitspieler() {
        BdsmMitspieler mitspieler = new BdsmMitspieler();
        mitspieler.setGeschlecht(geschlecht);
        mitspieler.setId(mitspielerId);
        mitspieler.setUserId(userId);
        mitspieler.setEigenesGeraet(eigenesGeraet);
        mitspieler.setName(name);
        mitspieler.setRollen(rollen);
        mitspieler.setSpieltMit(spieltMit);
        mitspieler.setVerfuegbareWerkzeuge(new ArrayList<>(werkzeuge));
        mitspieler.setSperrenVorFinaleAufloesen(sperrenVorFinaleAufloesen);
        return mitspieler;
    }
}
