package de.oaa.xxx.aufgaben.entity;

import de.oaa.xxx.aufgaben.AufgabenGruppe;
import de.oaa.xxx.aufgaben.AufgabenGruppeDisplay;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Lob;
import jakarta.persistence.OneToMany;
import jakarta.persistence.Table;

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

@Entity
@Table(name = "aufgabenGruppe")
public class AufgabenGruppeEntity {

    @Id
    @Column
    private UUID gruppenId;
    @Column
    private String name;
    @Column
    private String beschreibung;
    @Column
    private UUID userId;
    @Column
    private boolean privateGruppe;
    @Lob
    @Column(columnDefinition = "BLOB")
    private byte[] bild;
    @Column
    private String von;
    @Column
    private Integer relevanz;
    @OneToMany(mappedBy = "aufgabenGruppe")
    private List<ToyEntity> toys;
    @OneToMany(mappedBy = "aufgabenGruppe")
    private List<AufgabeEntity> aufgaben;
    @OneToMany(mappedBy = "aufgabenGruppe")
    private List<StrafeEntity> strafen;
    @OneToMany(mappedBy = "aufgabenGruppe")
    private List<SperreEntity> sperren;

    public UUID getGruppenId() { return gruppenId; }
    public void setGruppenId(UUID gruppenId) { this.gruppenId = gruppenId; }

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

    public String getBeschreibung() { return beschreibung; }
    public void setBeschreibung(String beschreibung) { this.beschreibung = beschreibung; }

    public UUID getUserId() { return userId; }
    public void setUserId(UUID userId) { this.userId = userId; }

    public boolean isPrivateGruppe() { return privateGruppe; }
    public void setPrivateGruppe(boolean privateGruppe) { this.privateGruppe = privateGruppe; }

    public byte[] getBild() { return bild; }
    public void setBild(byte[] bild) { this.bild = bild; }

    public String getVon() { return von; }
    public void setVon(String von) { this.von = von; }

    public Integer getRelevanz() { return relevanz; }
    public void setRelevanz(Integer relevanz) { this.relevanz = relevanz; }

    public List<ToyEntity> getToys() { return toys; }
    public void setToys(List<ToyEntity> toys) { this.toys = toys; }

    public List<AufgabeEntity> getAufgaben() { return aufgaben; }
    public void setAufgaben(List<AufgabeEntity> aufgaben) { this.aufgaben = aufgaben; }

    public List<StrafeEntity> getStrafen() { return strafen; }
    public void setStrafen(List<StrafeEntity> strafen) { this.strafen = strafen; }

    public List<SperreEntity> getSperren() { return sperren; }
    public void setSperren(List<SperreEntity> sperren) { this.sperren = sperren; }

    public AufgabenGruppe toAufgabenGruppe() {
        AufgabenGruppe gruppe = new AufgabenGruppe();
        gruppe.setGruppenId(gruppenId);
        gruppe.setUserId(userId);
        gruppe.setName(name);
        gruppe.setBeschreibung(beschreibung);
        gruppe.setPrivateGruppe(privateGruppe);
        gruppe.setBild(bild != null ? Base64.getEncoder().encodeToString(bild) : null);
        gruppe.setVon(von);
        gruppe.setToys(toys.stream().map(ToyEntity::toToy).toList());
        gruppe.setAufgaben(aufgaben.stream().map(AufgabeEntity::toAufgabe).toList());
        gruppe.setStrafen(strafen.stream().map(StrafeEntity::toStrafe).toList());
        gruppe.setSperren(sperren.stream().map(SperreEntity::toSperre).toList());
        return gruppe;
    }

    public static AufgabenGruppeEntity create(AufgabenGruppe gruppe) {
        AufgabenGruppeEntity entity = new AufgabenGruppeEntity();
        entity.setGruppenId(UUID.randomUUID());
        entity.setName(gruppe.getName());
        entity.setBeschreibung(gruppe.getBeschreibung());
        entity.setUserId(gruppe.getUserId());
        entity.setPrivateGruppe(gruppe.isPrivateGruppe());
        entity.setBild(gruppe.getBild() != null ? Base64.getDecoder().decode(gruppe.getBild()) : null);
        entity.setVon(gruppe.getVon());
        return entity;
    }

    public AufgabenGruppeDisplay toAufgabenGruppeDisplay() {
        AufgabenGruppeDisplay display = new AufgabenGruppeDisplay();
        display.setGruppenId(gruppenId);
        display.setUserId(userId);
        display.setName(name);
        display.setBeschreibung(beschreibung);
        display.setPrivateGruppe(privateGruppe);
        display.setBild(bild != null ? Base64.getEncoder().encodeToString(bild) : null);
        display.setVon(von);
        return display;
    }
}
