package de.oaa.xxx.user;

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

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import lombok.Getter;
import lombok.Setter;

@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;

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

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

    // ── Dating ──
    @Column(nullable = false, columnDefinition = "TINYINT(1) DEFAULT 0")
    private boolean datingAktiv = false;

    @Column(length = 200)
    private String datingStadt;

    @Column
    private Double datingLat;

    @Column
    private Double datingLon;

    /** Komma-separierte Geschlecht-Enum-Namen, z.B. "WEIBLICH,MAENNLICH". Null = keine Einschränkung. */
    @Column(length = 60)
    private String datingGeschlechter;

    /** Standard-Filter: maximale Entfernung in km. Null = kein Vorgabewert gespeichert. */
    @Column
    private Integer datingMaxDistanzKm;

    /** Standard-Filter: Mindestalter. Null = kein Vorgabewert gespeichert. */
    @Column
    private Integer datingMinAlter;

    /** Standard-Filter: Höchstalter. Null = kein Vorgabewert gespeichert. */
    @Column
    private Integer datingMaxAlter;

    // ── Locations/Events-Filter ──
    @Column(length = 200)
    private String filterCity;

    @Column
    private Double filterLat;

    @Column
    private Double filterLon;

    @Column
    private Integer filterMaxDistKm;

    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);
        user.setDatingAktiv(datingAktiv);
        user.setDatingStadt(datingStadt);
        user.setDatingLat(datingLat);
        user.setDatingLon(datingLon);
        user.setDatingGeschlechter(
                datingGeschlechter != null && !datingGeschlechter.isBlank()
                        ? Arrays.asList(datingGeschlechter.split(","))
                        : null);
        user.setDatingMaxDistanzKm(datingMaxDistanzKm);
        user.setDatingMinAlter(datingMinAlter);
        user.setDatingMaxAlter(datingMaxAlter);
        user.setFilterCity(filterCity);
        user.setFilterLat(filterLat);
        user.setFilterLon(filterLon);
        user.setFilterMaxDistKm(filterMaxDistKm);
        return user;
    }
}
