package fr.titionfire.ffsaf.rest.data;

import io.quarkus.runtime.annotations.RegisterForReflection;
import io.quarkus.security.identity.SecurityIdentity;
import lombok.Builder;
import lombok.Data;
import org.eclipse.microprofile.jwt.JsonWebToken;
import org.eclipse.microprofile.openapi.annotations.media.Schema;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;

@Data
@Builder
@RegisterForReflection
public class UserInfo {
    @Schema(description = "L'identifiant de l'utilisateur.", example = "1234567890")
    String id;
    @Schema(description = "Le nom complet de l'utilisateur.", example = "John Doe")
    String name;
    @Schema(description = "Le prénom de l'utilisateur.", example = "John")
    String givenName;
    @Schema(description = "Le nom de famille de l'utilisateur.", example = "Doe")
    String familyName;
    @Schema(description = "L'adresse e-mail de l'utilisateur.", example = "jihn.doe@test.fr")
    String email;
    @Schema(description = "L'adresse e-mail de l'utilisateur a été vérifiée.", example = "true")
    boolean emailVerified;
    @Schema(description = "La date d'expiration du token d'accès.")
    long expiration;
    @Schema(description = "La liste des groupes de l'utilisateur.")
    List<String> groups;
    @Schema(description = "La liste des rôles de l'utilisateur.")
    Set<String> roles;

    public static UserInfo makeUserInfo(JsonWebToken accessToken, SecurityIdentity securityIdentity) {
        UserInfo.UserInfoBuilder builder = UserInfo.builder();
        builder.id(accessToken.getSubject());
        builder.name(accessToken.getName());
        builder.givenName(accessToken.getClaim("given_name"));
        builder.familyName(accessToken.getClaim("family_name"));
        builder.email(accessToken.getClaim("email"));
        builder.emailVerified(accessToken.getClaim("email_verified"));
        builder.expiration(accessToken.getExpirationTime());
        List<String> groups = new ArrayList<>();
        if (accessToken.getClaim("user_groups") instanceof Iterable<?>) {
            for (Object str : (Iterable<?>) accessToken.getClaim("user_groups")) {
                groups.add(str.toString().substring(1, str.toString().length() - 1));
            }
        }
        builder.groups(groups);
        builder.roles(securityIdentity.getRoles());
        return builder.build();
    }
}
