package de.oaa.xxx.user;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;

import java.time.LocalDate;
import java.time.Period;
import java.util.UUID;

@Getter
@Setter
@Entity
@Table(name = "user")
public class UserEntity {

    @Id
    @Column
    private UUID userId;
    @Column
    private String name;
    @Column(unique = true)
    private String email;
    @Column
    private String password;

    @Column(columnDefinition = "TEXT")
    private String profilePicture;

    @Column(columnDefinition = "MEDIUMTEXT")
    private String profilePictureHq;

    @Column
    private LocalDate geburtsdatum;

    @Column
    private Integer groesse;

    @Column
    private Integer gewicht;

    @Enumerated(EnumType.STRING)
    @Column(length = 20)
    private Geschlecht geschlecht;

    @Enumerated(EnumType.STRING)
    @Column(length = 20)
    private Neigung neigung;

    @Enumerated(EnumType.STRING)
    @Column(length = 30)
    private Beziehungsstatus beziehungsstatus;

    @Column(columnDefinition = "TEXT")
    private String beschreibung;

    @Column(nullable = false, columnDefinition = "INT DEFAULT 0")
    private int lockeeXp;

    @Column(nullable = false, columnDefinition = "INT DEFAULT 0")
    private int keyholderXp;

    @Column(nullable = false, columnDefinition = "INT DEFAULT 0")
    private int bdsmXp;

    // ── Datenschutz / Sichtbarkeit ──
    @Enumerated(EnumType.STRING)
    @Column(length = 20, nullable = false, columnDefinition = "VARCHAR(20) DEFAULT 'ALLE'")
    private Sichtbarkeit sichtbarkeitGrunddaten = Sichtbarkeit.ALLE;

    @Enumerated(EnumType.STRING)
    @Column(length = 20, nullable = false, columnDefinition = "VARCHAR(20) DEFAULT 'ALLE'")
    private Sichtbarkeit sichtbarkeitGalerie = Sichtbarkeit.ALLE;

    @Enumerated(EnumType.STRING)
    @Column(length = 20, nullable = false, columnDefinition = "VARCHAR(20) DEFAULT 'ALLE'")
    private Sichtbarkeit sichtbarkeitFreunde = Sichtbarkeit.ALLE;

    @Enumerated(EnumType.STRING)
    @Column(length = 20, nullable = false, columnDefinition = "VARCHAR(20) DEFAULT 'ALLE'")
    private Sichtbarkeit sichtbarkeitFeed = Sichtbarkeit.ALLE;

    @Enumerated(EnumType.STRING)
    @Column(length = 20, nullable = false, columnDefinition = "VARCHAR(20) DEFAULT 'ALLE'")
    private Sichtbarkeit sichtbarkeitPinnwand = Sichtbarkeit.ALLE;

    @Enumerated(EnumType.STRING)
    @Column(length = 20, nullable = false, columnDefinition = "VARCHAR(20) DEFAULT 'ALLE'")
    private Sichtbarkeit sichtbarkeitXp = Sichtbarkeit.ALLE;

    @Enumerated(EnumType.STRING)
    @Column(length = 20, nullable = false, columnDefinition = "VARCHAR(20) DEFAULT 'ALLE'")
    private Sichtbarkeit sichtbarkeitLockhistorie = Sichtbarkeit.ALLE;

    @Column(nullable = false, columnDefinition = "TINYINT(1) DEFAULT 0")
    private boolean profilBeiVeroeffentlichungenSichtbar = false;

    public Integer getAlter() {
        return geburtsdatum != null ? Period.between(geburtsdatum, LocalDate.now()).getYears() : null;
    }

    @Override
    public String toString() {
        return "UserEntity[userId=" + userId + ", name=" + name + ", email=" + email + "]";
    }

    public User toUser() {
        User user = new User();
        user.setEmail(email);
        user.setName(name);
        user.setUserId(userId);
        user.setProfilePicture(profilePicture);
        user.setGeburtsdatum(geburtsdatum);
        user.setGroesse(groesse);
        user.setGewicht(gewicht);
        user.setGeschlecht(geschlecht);
        user.setNeigung(neigung);
        user.setBeziehungsstatus(beziehungsstatus);
        user.setBeschreibung(beschreibung);
        return user;
    }
}
