package fr.luc.gamingcore.model;

import java.util.Objects;
import java.util.UUID;

/**
 * Représente une invitation temporaire envoyée à un joueur pour rejoindre une guilde.
 */
public class GuildInvite {

    private final UUID guildId;
    private final UUID targetPlayerUuid;
    private final UUID senderUuid;
    private final long createdAt;
    private final long expireAt;

    /**
     * Constructeur d'une invitation de guilde.
     *
     * @param guildId          UUID de la guilde concernée.
     * @param targetPlayerUuid UUID du joueur invité.
     * @param senderUuid       UUID du joueur ayant envoyé l'invitation.
     * @param durationMillis   Durée de validité de l'invitation en millisecondes.
     */
    public GuildInvite(UUID guildId, UUID targetPlayerUuid, UUID senderUuid, long durationMillis) {
        this.guildId = Objects.requireNonNull(guildId, "Le UUID de la guilde ne peut pas être nul.");
        this.targetPlayerUuid = Objects.requireNonNull(targetPlayerUuid, "Le UUID du joueur cible ne peut pas être nul.");
        this.senderUuid = Objects.requireNonNull(senderUuid, "Le UUID de l'expéditeur ne peut pas être nul.");
        this.createdAt = System.currentTimeMillis();
        this.expireAt = this.createdAt + Math.max(1000L, durationMillis);
    }

    /**
     * Obtient le UUID de la guilde qui a émis l'invitation.
     *
     * @return L'UUID de la guilde.
     */
    public UUID getGuildId() {
        return guildId;
    }

    /**
     * Obtient le UUID du joueur recevant l'invitation.
     *
     * @return L'UUID du destinataire.
     */
    public UUID getTargetPlayerUuid() {
        return targetPlayerUuid;
    }

    /**
     * Obtient le UUID du joueur qui a initié l'invitation.
     *
     * @return L'UUID de l'émetteur.
     */
    public UUID getSenderUuid() {
        return senderUuid;
    }

    /**
     * Obtient la date et heure d'émission de l'invitation en millisecondes.
     *
     * @return Timestamp de création.
     */
    public long getCreatedAt() {
        return createdAt;
    }

    /**
     * Obtient la date et heure d'expiration de l'invitation en millisecondes.
     *
     * @return Timestamp d'expiration.
     */
    public long getExpireAt() {
        return expireAt;
    }

    /**
     * Vérifie si l'invitation a dépassé son délai de validité.
     *
     * @return true si l'invitation est expirée, false si elle est encore valide.
     */
    public boolean isExpired() {
        return System.currentTimeMillis() > expireAt;
    }

    /**
     * Obtient le nombre de secondes restantes avant expiration.
     *
     * @return Les secondes restantes (0 si expirée).
     */
    public long getRemainingSeconds() {
        long remaining = (expireAt - System.currentTimeMillis()) / 1000L;
        return Math.max(0L, remaining);
    }
}
