package dev.lions.unionflow.server.api.dto.auth.response;

import java.time.LocalDateTime;
import java.util.List;
import java.util.UUID;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

/**
 * Réponse d'authentification contenant le token JWT et les informations utilisateur.
 *
 * @author UnionFlow Team
 * @version 2.0
 * @since 2026-02-28
 */
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class LoginResponse {

    private String accessToken;
    private String refreshToken;
    @Builder.Default
    private String tokenType = "Bearer";
    private Long expiresIn;
    private LocalDateTime expirationDate;
    private UserInfo user;

    /**
     * Vérifie si le token est expiré.
     *
     * @return true si le token est expiré
     */
    public boolean isExpired() {
        return expirationDate != null && LocalDateTime.now().isAfter(expirationDate);
    }

    /**
     * Informations de l'utilisateur connecté.
     */
    @Getter
    @Setter
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public static class UserInfo {
        private UUID id;
        private String nom;
        private String prenom;
        private String email;
        private String username;
        private String typeCompte;
        private List<String> roles;
        private List<String> permissions;
        private EntiteInfo entite;

        /**
         * Retourne le nom complet de l'utilisateur.
         *
         * @return Prénom + Nom ou nom d'utilisateur si absent
         */
        public String getNomComplet() {
            if (prenom != null && nom != null) {
                return prenom + " " + nom;
            }
            return nom != null ? nom : username;
        }
    }

    /**
     * Informations sur l'entité (organisation/membre) de l'utilisateur.
     */
    @Getter
    @Setter
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public static class EntiteInfo {
        private UUID id;
        private String nom;
        private String type;
        private String pays;
        private String ville;
    }
}
