package dev.lions.security;

import jakarta.enterprise.context.ApplicationScoped;
import jakarta.servlet.Filter;
import jakarta.servlet.FilterChain;
import jakarta.servlet.FilterConfig;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import lombok.extern.slf4j.Slf4j;

import java.io.IOException;

/**
 * Filtre de sécurité pour l'application.
 * Implémente la logique de sécurité pour toutes les requêtes entrantes.
 *
 * @author Lions Dev Team
 * @version 1.0
 */
@Slf4j
@ApplicationScoped
@WebFilter(urlPatterns = "/*")
public class SecurityFilter implements Filter {

  /**
   * Initialise le filtre.
   * Cette méthode est appelée par le conteneur lors du démarrage.
   *
   * @param filterConfig Configuration du filtre
   */
  @Override
  public void init(FilterConfig filterConfig) {
    log.info("Initialisation du filtre de sécurité");
  }

  /**
   * Applique la logique de filtrage sur chaque requête.
   *
   * @param request La requête entrante
   * @param response La réponse
   * @param chain La chaîne de filtres
   * @throws IOException En cas d'erreur d'entrée/sortie
   * @throws ServletException En cas d'erreur de servlet
   */
  @Override
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
      throws IOException, ServletException {

    HttpServletRequest httpRequest = (HttpServletRequest) request;
    String requestUri = httpRequest.getRequestURI();

    log.debug("Traitement de la requête: {}", requestUri);

    try {
      // Vérification de sécurité de base
      if (isSecurityCheckPassed(httpRequest)) {
        chain.doFilter(request, response);
      } else {
        log.warn("Accès refusé pour la requête: {}", requestUri);
        HttpServletResponse httpResponse = (HttpServletResponse) response;
        httpResponse.sendError(HttpServletResponse.SC_FORBIDDEN, "Accès refusé");
      }
    } catch (Exception e) {
      log.error("Erreur lors du traitement de la requête: {}", requestUri, e);
      throw e;
    }
  }

  /**
   * Effectue les vérifications de sécurité nécessaires.
   *
   * @param request La requête HTTP à vérifier
   * @return true si la requête passe les vérifications de sécurité
   */
  private boolean isSecurityCheckPassed(HttpServletRequest request) {
    // Implémentez ici votre logique de sécurité spécifique
    // Par exemple : vérification des tokens, authentification, autorisations...
    log.trace("Vérification de sécurité pour: {}", request.getRequestURI());
    return true; // À adapter selon vos besoins de sécurité
  }

  /**
   * Méthode appelée lors de la destruction du filtre.
   */
  @Override
  public void destroy() {
    log.info("Destruction du filtre de sécurité");
  }
}