package dev.lions.btpxpress.view;

import io.quarkus.oidc.IdToken;
import io.quarkus.security.identity.SecurityIdentity;
import jakarta.annotation.PostConstruct;
import jakarta.enterprise.context.RequestScoped;
import jakarta.faces.application.FacesMessage;
import jakarta.faces.context.FacesContext;
import jakarta.inject.Inject;
import jakarta.inject.Named;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.microprofile.jwt.JsonWebToken;

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;

/**
 * Bean pour gérer la page de profil utilisateur.
 *
 * @author BTP Xpress Team
 * @version 1.0
 */
@Named("profileView")
@RequestScoped
@Getter
@Setter
@Slf4j
public class ProfileView {

    @Inject
    SecurityIdentity securityIdentity;

    @Inject
    @IdToken
    JsonWebToken idToken;

    private String nomComplet;
    private String prenom;
    private String nom;
    private String email;
    private String username;
    private String telephone;
    private String organisation;
    private List<String> roles;
    private String derniereConnexion;
    private String tokenExpiration;

    @PostConstruct
    public void init() {
        try {
            log.info("Initialisation du profil utilisateur");

            if (securityIdentity != null && securityIdentity.getPrincipal() != null && idToken != null) {
                // Nom complet
                nomComplet = idToken.getClaim("name");
                if (nomComplet == null || nomComplet.trim().isEmpty()) {
                    nomComplet = idToken.getClaim("preferred_username");
                }
                if (nomComplet == null || nomComplet.trim().isEmpty()) {
                    nomComplet = securityIdentity.getPrincipal().getName();
                }

                // Prénom et nom
                prenom = idToken.getClaim("given_name");
                nom = idToken.getClaim("family_name");

                // Email
                email = idToken.getClaim("email");

                // Username
                username = idToken.getClaim("preferred_username");
                if (username == null || username.trim().isEmpty()) {
                    username = securityIdentity.getPrincipal().getName();
                }

                // Téléphone
                telephone = idToken.getClaim("phone_number");

                // Organisation
                organisation = idToken.getClaim("organization");

                // Rôles
                roles = new ArrayList<>();
                Set<String> userRoles = securityIdentity.getRoles();
                if (userRoles != null) {
                    for (String role : userRoles) {
                        // Formatage des rôles pour affichage
                        String formattedRole = role.replace("_", " ").replace("-", " ");
                        formattedRole = capitalizeWords(formattedRole);
                        roles.add(formattedRole);
                    }
                }

                // Dernière connexion (auth_time claim)
                Long authTime = idToken.getClaim("auth_time");
                if (authTime != null) {
                    LocalDateTime dateTime = LocalDateTime.ofInstant(
                        Instant.ofEpochSecond(authTime),
                        ZoneId.systemDefault()
                    );
                    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss");
                    derniereConnexion = dateTime.format(formatter);
                } else {
                    derniereConnexion = "Non disponible";
                }

                // Expiration du token
                Long exp = idToken.getExpirationTime();
                if (exp != null) {
                    LocalDateTime dateTime = LocalDateTime.ofInstant(
                        Instant.ofEpochSecond(exp),
                        ZoneId.systemDefault()
                    );
                    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss");
                    tokenExpiration = dateTime.format(formatter);
                } else {
                    tokenExpiration = "Non disponible";
                }

                log.info("Profil chargé pour: {}", nomComplet);

            } else {
                log.warn("SecurityIdentity ou IdToken non disponible");
                setDefaultValues();
            }

        } catch (Exception e) {
            log.error("Erreur lors de l'initialisation du profil", e);
            setDefaultValues();
        }
    }

    /**
     * Valeurs par défaut si les données ne sont pas disponibles.
     */
    private void setDefaultValues() {
        nomComplet = "Utilisateur";
        email = "utilisateur@btpxpress.com";
        username = "utilisateur";
        roles = new ArrayList<>();
        roles.add("Utilisateur");
        derniereConnexion = "Non disponible";
        tokenExpiration = "Non disponible";
    }

    /**
     * Capitalize first letter of each word.
     */
    private String capitalizeWords(String str) {
        if (str == null || str.isEmpty()) {
            return str;
        }
        String[] words = str.toLowerCase().split(" ");
        StringBuilder result = new StringBuilder();
        for (String word : words) {
            if (!word.isEmpty()) {
                result.append(Character.toUpperCase(word.charAt(0)))
                      .append(word.substring(1))
                      .append(" ");
            }
        }
        return result.toString().trim();
    }

    /**
     * Redirige vers la page de changement de mot de passe Keycloak.
     */
    public void changerMotDePasse() {
        try {
            FacesContext facesContext = FacesContext.getCurrentInstance();
            jakarta.faces.context.ExternalContext externalContext = facesContext.getExternalContext();

            // URL de la page account de Keycloak
            String keycloakAccountUrl = "https://security.lions.dev/realms/btpxpress/account/";

            externalContext.redirect(keycloakAccountUrl);
            facesContext.responseComplete();

        } catch (Exception e) {
            log.error("Erreur lors de la redirection vers Keycloak account", e);
            FacesContext.getCurrentInstance().addMessage(null,
                new FacesMessage(FacesMessage.SEVERITY_ERROR,
                    "Erreur", "Impossible de rediriger vers la page de gestion du compte"));
        }
    }

    /**
     * Retourne les initiales de l'utilisateur pour l'avatar.
     */
    public String getInitiales() {
        if (nomComplet == null || nomComplet.trim().isEmpty()) {
            return "U";
        }

        String[] parts = nomComplet.trim().split("\\s+");
        if (parts.length >= 2) {
            return String.valueOf(parts[0].charAt(0)).toUpperCase() +
                   String.valueOf(parts[1].charAt(0)).toUpperCase();
        } else if (parts.length == 1) {
            return parts[0].substring(0, Math.min(2, parts[0].length())).toUpperCase();
        }
        return "U";
    }

    /**
     * Retourne le nombre total de rôles.
     */
    public int getNombreRoles() {
        return roles != null ? roles.size() : 0;
    }
}
