package dev.lions.user.manager.client.view;

import dev.lions.user.manager.client.service.AuditServiceClient;
import dev.lions.user.manager.dto.audit.AuditLogDTO;
import dev.lions.user.manager.enums.audit.TypeActionAudit;
import jakarta.annotation.PostConstruct;
import jakarta.faces.application.FacesMessage;
import jakarta.faces.context.FacesContext;
import jakarta.faces.view.ViewScoped;
import jakarta.inject.Inject;
import jakarta.inject.Named;
import lombok.Data;
import org.eclipse.microprofile.rest.client.inject.RestClient;

import java.io.Serializable;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;

/**
 * Bean JSF pour la consultation des logs d'audit
 * 
 * @author Lions User Manager
 * @version 1.0.0
 */
@Named("auditConsultationBean")
@ViewScoped
@Data
public class AuditConsultationBean implements Serializable {

    private static final long serialVersionUID = 1L;
    private static final Logger LOGGER = Logger.getLogger(AuditConsultationBean.class.getName());

    @Inject
    @RestClient
    private AuditServiceClient auditServiceClient;

    // Liste des logs
    private List<AuditLogDTO> auditLogs = new ArrayList<>();
    private AuditLogDTO selectedLog;

    // Filtres de recherche
    private String acteurUsername;
    private LocalDateTime dateDebut;
    private LocalDateTime dateFin;
    private TypeActionAudit selectedTypeAction;
    private String ressourceType;
    private Boolean succes;

    // Pagination
    private int currentPage = 0;
    private int pageSize = 50;
    private long totalRecords = 0;

    // Statistiques
    private Map<TypeActionAudit, Long> actionStatistics;
    private Map<String, Long> userActivityStatistics;
    private Long failureCount = 0L;
    private Long successCount = 0L;

    // Options
    private List<TypeActionAudit> typeActionOptions = List.of(TypeActionAudit.values());
    private List<String> availableRealms = new ArrayList<>();

    private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss");

    @PostConstruct
    public void init() {
        loadRealms();
        loadStatistics();
    }

    /**
     * Rechercher des logs d'audit
     */
    public void searchLogs() {
        try {
            String dateDebutStr = dateDebut != null ? dateDebut.format(DATE_FORMATTER) : null;
            String dateFinStr = dateFin != null ? dateFin.format(DATE_FORMATTER) : null;

            auditLogs = auditServiceClient.searchLogs(
                acteurUsername,
                dateDebutStr,
                dateFinStr,
                selectedTypeAction,
                ressourceType,
                succes,
                currentPage,
                pageSize
            );

            totalRecords = auditLogs.size();
            addSuccessMessage("Recherche effectuée: " + totalRecords + " résultat(s) trouvé(s)");
        } catch (Exception e) {
            LOGGER.severe("Erreur lors de la recherche: " + e.getMessage());
            addErrorMessage("Erreur lors de la recherche: " + e.getMessage());
        }
    }

    /**
     * Charger les logs par acteur
     */
    public void loadLogsByActeur(String username) {
        try {
            auditLogs = auditServiceClient.getLogsByActeur(username, 100);
            totalRecords = auditLogs.size();
        } catch (Exception e) {
            LOGGER.severe("Erreur lors du chargement: " + e.getMessage());
            addErrorMessage("Erreur lors du chargement: " + e.getMessage());
        }
    }

    /**
     * Charger les logs par realm
     */
    public void loadLogsByRealm(String realmName) {
        try {
            String dateDebutStr = dateDebut != null ? dateDebut.format(DATE_FORMATTER) : null;
            String dateFinStr = dateFin != null ? dateFin.format(DATE_FORMATTER) : null;

            auditLogs = auditServiceClient.getLogsByRealm(
                realmName,
                dateDebutStr,
                dateFinStr,
                currentPage,
                pageSize
            );

            totalRecords = auditLogs.size();
        } catch (Exception e) {
            LOGGER.severe("Erreur lors du chargement: " + e.getMessage());
            addErrorMessage("Erreur lors du chargement: " + e.getMessage());
        }
    }

    /**
     * Charger les statistiques
     */
    public void loadStatistics() {
        try {
            String dateDebutStr = dateDebut != null ? dateDebut.format(DATE_FORMATTER) : null;
            String dateFinStr = dateFin != null ? dateFin.format(DATE_FORMATTER) : null;

            actionStatistics = auditServiceClient.getActionStatistics(dateDebutStr, dateFinStr);
            userActivityStatistics = auditServiceClient.getUserActivityStatistics(dateDebutStr, dateFinStr);
            failureCount = auditServiceClient.getFailureCount(dateDebutStr, dateFinStr);
            successCount = auditServiceClient.getSuccessCount(dateDebutStr, dateFinStr);
        } catch (Exception e) {
            LOGGER.severe("Erreur lors du chargement des statistiques: " + e.getMessage());
        }
    }

    /**
     * Exporter les logs en CSV
     */
    public void exportToCSV() {
        try {
            String dateDebutStr = dateDebut != null ? dateDebut.format(DATE_FORMATTER) : null;
            String dateFinStr = dateFin != null ? dateFin.format(DATE_FORMATTER) : null;

            String csv = auditServiceClient.exportLogsToCSV(dateDebutStr, dateFinStr);
            // TODO: Implémenter le téléchargement du fichier CSV
            addSuccessMessage("Export CSV généré avec succès");
        } catch (Exception e) {
            LOGGER.severe("Erreur lors de l'export: " + e.getMessage());
            addErrorMessage("Erreur lors de l'export: " + e.getMessage());
        }
    }

    /**
     * Réinitialiser les filtres
     */
    public void resetFilters() {
        acteurUsername = null;
        dateDebut = null;
        dateFin = null;
        selectedTypeAction = null;
        ressourceType = null;
        succes = null;
        currentPage = 0;
        auditLogs.clear();
    }

    /**
     * Charger les realms disponibles
     */
    private void loadRealms() {
        // TODO: Implémenter la récupération des realms depuis Keycloak
        availableRealms = List.of("master", "btpxpress", "unionflow");
    }

    // Méthodes utilitaires
    private void addSuccessMessage(String message) {
        FacesContext.getCurrentInstance().addMessage(null,
            new FacesMessage(FacesMessage.SEVERITY_INFO, "Succès", message));
    }

    private void addErrorMessage(String message) {
        FacesContext.getCurrentInstance().addMessage(null,
            new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erreur", message));
    }
}

