import { NextRequest, NextResponse } from 'next/server';

// This ensures this route is always handled at runtime and never prerendered
export const dynamic = 'force-dynamic';

export async function GET(req: NextRequest) {
  try {
    // Check for Authorization in headers first, then fall back to cookies
    let token = req.headers.get('Authorization')?.replace('Bearer ', '');
    
    // If not in headers, check cookies
    if (!token) {
      token = req.cookies.get('Authorization')?.value;
      console.log('Auth check: Token from cookies:', token ? `${token.substring(0, 10)}...` : 'none');
      
      // Debug: List all cookies
      const cookiesList = req.cookies.getAll();
      console.log('Auth check: All cookies:', JSON.stringify(cookiesList.map(c => c.name)));
    } else {
      console.log('Auth check: Token from headers:', token.substring(0, 10) + '...');
    }
    
    if (!token) {
      console.log('Auth check failed: No Authorization token found');
      return NextResponse.json(
        { error: 'No authorization token found' },
        { status: 401 }
      );
    }
    
    console.log('Auth check: Token found -', token.substring(0, 15) + '...');
    
    const apiUrl = process.env.SERVER_API_URL || 'http://localhost:3001/api';
    
    // Validate API URL to prevent 500 errors
    if (!apiUrl || apiUrl === 'undefined' || apiUrl === 'null') {
      console.warn('SERVER_API_URL not properly set in auth check, using localhost fallback');
      const fallbackUrl = 'http://localhost:3001/api';
      console.log(`Auth check: Calling external API: ${fallbackUrl}/auth/me`);
    } else {
      console.log(`Auth check: Calling external API: ${apiUrl}/auth/me`);
    }
    
    try {
      const res = await fetch(`${apiUrl}/auth/me`, {
        method: 'GET',
        headers: {
          'Content-Type': 'application/json',
          'Authorization': `Bearer ${token}`
        },
        cache: 'no-store'
      });
      
      console.log('Auth check: External API response status:', res.status);
      
      if (!res.ok) {
        try {
          const errorData = await res.json();
          console.log('Auth check failed:', {
            status: res.status, 
            statusText: res.statusText,
            body: errorData
          });
        } catch {
          const errorText = await res.text().catch(() => 'No response body');
          console.log('Auth check failed:', {
            status: res.status, 
            statusText: res.statusText,
            body: errorText
          });
        }
        
        return NextResponse.json(
          { error: 'Authentication failed', details: res.statusText },
          { status: res.status }
        );
      }
      
      const data = await res.json();
      console.log('Auth check succeeded:', { userId: data._id || 'unknown' });
      return NextResponse.json(data);
    } catch (fetchError) {
      console.error('Auth check network error:', fetchError);
      return NextResponse.json(
        { 
          error: 'Failed to connect to authentication service', 
          details: fetchError instanceof Error ? fetchError.message : String(fetchError)
        },
        { status: 503 } // Service Unavailable
      );
    }
  } catch (error) {
    console.error('Auth check error:', error);
    return NextResponse.json(
      { 
        error: 'Failed to validate authentication', 
        details: error instanceof Error ? error.message : String(error)
      },
      { status: 500 }
    );
  }
} 