import { Injectable } from "@angular/core";
import {
  CanActivate,
  Router,
  ActivatedRouteSnapshot,
  RouterStateSnapshot,
} from "@angular/router";
import { Observable, of } from "rxjs";
import { NavigationService } from "./navigation.service";

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

  canActivate(
    route: ActivatedRouteSnapshot,
    state: RouterStateSnapshot
  ): Observable<boolean> | Promise<boolean> | boolean {
    // Vérifier si les données de menu sont disponibles
    const menus = localStorage.getItem("__menus");

    if (!menus) {
      console.warn(
        "Données de menu non disponibles, redirection vers la connexion"
      );
      this.navigationService.redirectToLogin();
      return false;
    }

    try {
      const parsedMenus = JSON.parse(menus);

      // Supporter les deux formats: tableau direct ou objet {role, menus: [...]}
      const menusArray = Array.isArray(parsedMenus)
        ? parsedMenus
        : (parsedMenus?.menus && Array.isArray(parsedMenus.menus) ? parsedMenus.menus : null);

      // Vérifier la structure des données
      if (!menusArray || menusArray.length === 0) {
        console.warn("Structure de données de menu invalide");
        this.navigationService.redirectToLogin();
        return false;
      }

      const firstMenu = menusArray[0];
      if (
        !firstMenu ||
        !firstMenu.submenu ||
        !Array.isArray(firstMenu.submenu) ||
        firstMenu.submenu.length === 0
      ) {
        console.warn("Sous-menu manquant ou invalide");
        this.navigationService.redirectToLogin();
        return false;
      }

      // Vérifier que les champs essentiels sont présents
      const firstSubmenu = firstMenu.submenu[0];
      if (!firstSubmenu.domaine || !firstSubmenu.module) {
        console.warn("Données de domaine ou module manquantes");
        this.navigationService.redirectToLogin();
        return false;
      }

      // Données valides, autoriser la navigation
      return true;
    } catch (error) {
      console.error("Erreur lors de la validation des données de menu:", error);
      this.navigationService.redirectToLogin();
      return false;
    }
  }
}
