import { Injectable } from "@angular/core";
import { Router } from "@angular/router";

@Injectable({
  providedIn: "root",
})
export class NavigationService {
  constructor(private router: Router) {}

  /**
   * Navigation sécurisée après connexion avec vérification des données
   */
  async navigateAfterLogin(): Promise<boolean> {
    try {
      // Vérifier que les données essentielles sont disponibles
      await this.ensureDataAvailability();

      // Attendre un cycle pour que Angular se stabilise
      await this.waitForStabilization();

      // Navigation avec gestion d'erreur
      const navigationSuccess = await this.router.navigate(["/"]);

      if (!navigationSuccess) {
        console.warn("Navigation échouée, tentative de fallback");
        return this.fallbackNavigation();
      }

      return true;
    } catch (error) {
      console.error("Erreur lors de la navigation post-login:", error);
      return this.fallbackNavigation();
    }
  }

  /**
   * Vérifier que les données essentielles sont disponibles
   */
  private async ensureDataAvailability(): Promise<void> {
    const maxRetries = 5;
    const retryDelay = 200;

    for (let i = 0; i < maxRetries; i++) {
      const menus = localStorage.getItem("__menus");
      const user = localStorage.getItem("__user");
      const token = localStorage.getItem("__token");

      if (menus && user && token) {
        try {
          // Vérifier la validité des données JSON
          const parsedMenus = JSON.parse(menus);
          const parsedUser = JSON.parse(user);
          const parsedToken = JSON.parse(token);

          // Vérifier la structure des menus
          if (this.validateMenuStructure(parsedMenus)) {
            return; // Données valides
          }
        } catch (error) {
          console.warn(`Tentative ${i + 1}: Données corrompues`, error);
        }
      }

      if (i < maxRetries - 1) {
        console.log(`Tentative ${i + 1}: Attente des données...`);
        await new Promise((resolve) => setTimeout(resolve, retryDelay));
      }
    }

    throw new Error(
      "Données essentielles non disponibles après plusieurs tentatives"
    );
  }

  /**
   * Valider la structure des données de menu
   */
  private validateMenuStructure(menus: any): boolean {
    // Supporter les deux formats: tableau direct ou objet {role, menus: [...]}
    const menusArray = Array.isArray(menus) ? menus : menus?.menus;
    return (
      Array.isArray(menusArray) &&
      menusArray.length > 0 &&
      menusArray[0] &&
      Array.isArray(menusArray[0].submenu) &&
      menusArray[0].submenu.length > 0 &&
      menusArray[0].submenu[0].domaine &&
      menusArray[0].submenu[0].module
    );
  }

  /**
   * Attendre que Angular se stabilise
   */
  private async waitForStabilization(): Promise<void> {
    return new Promise((resolve) => {
      // Utiliser setTimeout pour attendre le prochain tick
      setTimeout(() => {
        // Utiliser requestAnimationFrame pour attendre le prochain frame
        requestAnimationFrame(() => {
          resolve();
        });
      }, 100);
    });
  }

  /**
   * Navigation de fallback en cas d'échec
   */
  private fallbackNavigation(): Promise<boolean> {
    console.log("Utilisation de la navigation de fallback");

    return new Promise((resolve) => {
      // Délai plus long pour permettre l'initialisation
      setTimeout(() => {
        // Force reload vers la page d'accueil
        window.location.href = "/";
        resolve(true);
      }, 1000);
    });
  }

  /**
   * Nettoyer les données de navigation et rediriger vers le login
   */
  redirectToLogin(): void {
    // Nettoyer les données problématiques
    localStorage.removeItem("__menus");
    localStorage.removeItem("__user");
    localStorage.removeItem("__token");
    localStorage.removeItem("isFirst");

    // Redirection vers le login
    this.router.navigate(["/login"]);
  }
}
