import { getUserById } from '../services/auth';
import type { AstroGlobal } from 'astro';
import type { APIContext } from 'astro';

// Type d'entrée flexible pour fonctionner avec Astro et les API
type AuthContext = AstroGlobal | APIContext | { request: Request };

// Middleware d'authentification pour protéger les routes
export async function isAuthenticated(context: AuthContext) {
  // Déterminer si nous avons affaire à un objet Astro ou un objet API
  let cookies;
  
  if ('cookies' in context) {
    // Cas des pages Astro normales
    cookies = context.cookies;
  } else if ('request' in context) {
    // Cas des endpoints API
    const cookieHeader = context.request.headers.get('cookie');
    if (!cookieHeader) {
      return {
        isAuthenticated: false,
        user: null,
        redirect: {
          destination: '/login',
          message: 'Veuillez vous connecter pour accéder à cette page'
        }
      };
    }
    
    // Extraire la valeur du cookie userId manuellement
    const cookies = parseCookies(cookieHeader);
    const userId = cookies.userId;
    
    if (!userId) {
      return {
        isAuthenticated: false,
        user: null,
        redirect: {
          destination: '/login',
          message: 'Veuillez vous connecter pour accéder à cette page'
        }
      };
    }
    
    // Vérifier que l'utilisateur existe dans la base de données
    const user = await getUserById(userId);
    
    // Si l'utilisateur n'existe pas, la session est invalide
    if (!user) {
      return {
        isAuthenticated: false,
        user: null,
        redirect: {
          destination: '/login',
          message: 'Votre session a expiré. Veuillez vous reconnecter'
        }
      };
    }
    
    // L'utilisateur est authentifié
    return {
      isAuthenticated: true,
      user,
      redirect: null
    };
  } else {
    // Cas non géré
    return {
      isAuthenticated: false,
      user: null,
      redirect: {
        destination: '/login',
        message: 'Erreur d\'authentification'
      }
    };
  }
  
  // Pour les pages Astro normales, continuer avec le code original
  const userId = cookies.get('userId')?.value;
  
  // Si aucun userId n'est trouvé, rediriger vers la page de connexion
  if (!userId) {
    return {
      isAuthenticated: false,
      user: null,
      redirect: {
        destination: '/login',
        message: 'Veuillez vous connecter pour accéder à cette page'
      }
    };
  }
  
  // Vérifier que l'utilisateur existe dans la base de données
  const user = await getUserById(userId);
  
  // Si l'utilisateur n'existe pas, effacer le cookie et rediriger
  if (!user) {
    if ('cookies' in context) {
      context.cookies.delete('userId');
    }
    return {
      isAuthenticated: false,
      user: null,
      redirect: {
        destination: '/login',
        message: 'Votre session a expiré. Veuillez vous reconnecter'
      }
    };
  }
  
  // L'utilisateur est authentifié
  return {
    isAuthenticated: true,
    user,
    redirect: null
  };
}

// Fonction pour parser manuellement les cookies depuis le header
function parseCookies(cookieHeader: string): Record<string, string> {
  const cookies: Record<string, string> = {};
  cookieHeader.split(';').forEach(cookie => {
    const [name, value] = cookie.trim().split('=');
    if (name && value) cookies[name] = decodeURIComponent(value);
  });
  return cookies;
}

// Fonction d'authentification pour les pages publiques qui ont besoin de l'utilisateur (optionnel)
export async function getAuthUser(context: AuthContext) {
  if ('cookies' in context) {
    const userId = context.cookies.get('userId')?.value;
    
    if (!userId) {
      return {
        isAuthenticated: false,
        user: null
      };
    }
    
    const user = await getUserById(userId);
    
    if (!user) {
      context.cookies.delete('userId');
      return {
        isAuthenticated: false,
        user: null
      };
    }
    
    return {
      isAuthenticated: true,
      user
    };
  } else if ('request' in context) {
    const cookieHeader = context.request.headers.get('cookie');
    if (!cookieHeader) {
      return {
        isAuthenticated: false,
        user: null
      };
    }
    
    const cookies = parseCookies(cookieHeader);
    const userId = cookies.userId;
    
    if (!userId) {
      return {
        isAuthenticated: false,
        user: null
      };
    }
    
    const user = await getUserById(userId);
    
    if (!user) {
      return {
        isAuthenticated: false,
        user: null
      };
    }
    
    return {
      isAuthenticated: true,
      user
    };
  }
  
  return {
    isAuthenticated: false,
    user: null
  };
}