package de.oaa.xxx.session.entity;

import de.oaa.xxx.session.GeschlechtEnum;
import de.oaa.xxx.session.Mitspieler;
import de.oaa.xxx.session.RolleEnum;
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.OneToMany;
import jakarta.persistence.Table;

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

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

    @Id
    @Column
    private UUID mitspielerId;
    @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<>();
    @ManyToOne
    @JoinColumn(name = "sessionId", nullable = false)
    private SessionEntity session;
    @OneToMany(mappedBy = "mitspieler", fetch = FetchType.EAGER)
    private List<AktiveSperreEntity> aktiveSperren = new ArrayList<>();

    public UUID getMitspielerId() { return mitspielerId; }
    public void setMitspielerId(UUID mitspielerId) { this.mitspielerId = mitspielerId; }

    public String getName() { return name; }
    public void setName(String name) { this.name = name; }

    public GeschlechtEnum getGeschlecht() { return geschlecht; }
    public void setGeschlecht(GeschlechtEnum geschlecht) { this.geschlecht = geschlecht; }

    public List<Werkzeug> getWerkzeuge() { return werkzeuge; }
    public void setWerkzeuge(List<Werkzeug> werkzeuge) { this.werkzeuge = werkzeuge; }

    public List<GeschlechtEnum> getSpieltMit() { return spieltMit; }
    public void setSpieltMit(List<GeschlechtEnum> spieltMit) { this.spieltMit = spieltMit; }

    public List<RolleEnum> getRollen() { return rollen; }
    public void setRollen(List<RolleEnum> rollen) { this.rollen = rollen; }

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

    public List<AktiveSperreEntity> getAktiveSperren() { return aktiveSperren; }
    public void setAktiveSperren(List<AktiveSperreEntity> aktiveSperren) { this.aktiveSperren = aktiveSperren; }

    public Mitspieler toMitspieler() {
        Mitspieler mitspieler = new Mitspieler();
        mitspieler.setGeschlecht(geschlecht);
        mitspieler.setId(mitspielerId);
        mitspieler.setName(name);
        mitspieler.setRollen(rollen);
        mitspieler.setSpieltMit(spieltMit);
        mitspieler.setVerfuegbareWerkzeuge(new ArrayList<>(werkzeuge));
        return mitspieler;
    }
}
