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

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 lombok.Getter;
import lombok.Setter;

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

import de.oaa.xxx.games.common.aufgaben.AufgabenGruppe;
import de.oaa.xxx.games.common.aufgaben.AufgabenGruppeDisplay;

@Getter
@Setter
@Entity
@Table(name = "aufgaben_gruppe")
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;
    @OneToMany(mappedBy = "aufgabenGruppe")
    private List<AufgabeEntity> aufgaben;
    @OneToMany(mappedBy = "aufgabenGruppe")
    private List<StrafeEntity> strafen;
    @OneToMany(mappedBy = "aufgabenGruppe")
    private List<SperreEntity> sperren;
    @OneToMany(mappedBy = "aufgabenGruppe")
    private List<FinisherEntity> finisher;

    @Override
    public String toString() {
        return "AufgabenGruppeEntity[gruppenId=" + gruppenId + ", name=" + name + ", userId=" + userId
                + ", privat=" + privateGruppe + ", von=" + von + "]";
    }

    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.setAufgaben(aufgaben.stream().map(AufgabeEntity::toAufgabe).toList());
        gruppe.setStrafen(strafen.stream().map(StrafeEntity::toStrafe).toList());
        gruppe.setSperren(sperren.stream().map(SperreEntity::toSperre).toList());
        gruppe.setFinisher(finisher.stream().map(FinisherEntity::toFinisher).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;
    }
}
