import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';
import { refreshAccessToken } from '@/lib/api/refresh-token';

/**
 * 🔵 Next.js 내부 API - 인증 상태 확인 (PHP 백엔드 X)
 *
 * ⚡ 설계 목적:
 * - 성능 최적화: 매번 PHP 백엔드 호출 대신 로컬 쿠키만 확인
 * - 백엔드 부하 감소: 간단한 인증 확인은 Next.js에서 처리
 * - 사용자 경험: 즉시 응답으로 빠른 페이지 전환
 *
 * 📍 사용 위치:
 * - LoginPage.tsx: 이미 로그인된 사용자를 대시보드로 리다이렉트
 * - SignupPage.tsx: 이미 로그인된 사용자를 대시보드로 리다이렉트
 * - 뒤로가기 시 캐시 문제 방지
 *
 * 🔄 동작 방식:
 * 1. HttpOnly 쿠키에서 access_token, refresh_token 확인
 * 2. access_token 있음 → { authenticated: true } 즉시 응답
 * 3. refresh_token만 있음 → PHP /api/v1/refresh 호출하여 토큰 갱신
 * 4. 둘 다 없음 → { authenticated: false } 응답
 *
 * ⚠️ 주의:
 * - 이 API는 PHP 백엔드에 존재하지 않습니다
 * - Next.js 프론트엔드 자체 유틸리티 API입니다
 * - 실제 인증 로직은 여전히 PHP 백엔드가 담당합니다
 */
export async function GET(request: NextRequest) {
  try {
    // Get tokens from HttpOnly cookies
    const accessToken = request.cookies.get('access_token')?.value;
    const refreshToken = request.cookies.get('refresh_token')?.value;

    // No tokens at all - not authenticated
    if (!accessToken && !refreshToken) {
      return NextResponse.json(
        { error: 'Not authenticated' },
        { status: 401 }
      );
    }

    // Has access token - authenticated
    if (accessToken) {
      return NextResponse.json(
        { authenticated: true },
        { status: 200 }
      );
    }

    // Only has refresh token - try to refresh
    if (refreshToken && !accessToken) {

      // 공유 캐시를 사용하는 refreshAccessToken 함수 사용
      const refreshResult = await refreshAccessToken(refreshToken, 'auth/check');

      if (refreshResult.success && refreshResult.accessToken) {

        // Set new tokens with Safari-compatible configuration
        const isProduction = process.env.NODE_ENV === 'production';

        const accessTokenCookie = [
          `access_token=${refreshResult.accessToken}`,
          'HttpOnly',
          ...(isProduction ? ['Secure'] : []),
          'SameSite=Lax',
          'Path=/',
          `Max-Age=${refreshResult.expiresIn || 7200}`,
        ].join('; ');

        const refreshTokenCookie = [
          `refresh_token=${refreshResult.refreshToken}`,
          'HttpOnly',
          ...(isProduction ? ['Secure'] : []),
          'SameSite=Lax',
          'Path=/',
          'Max-Age=604800',
        ].join('; ');

        const response = NextResponse.json(
          { authenticated: true, refreshed: true },
          { status: 200 }
        );

        response.headers.append('Set-Cookie', accessTokenCookie);
        response.headers.append('Set-Cookie', refreshTokenCookie);

        return response;
      }

      // Refresh failed - not authenticated
      return NextResponse.json(
        { error: 'Token refresh failed' },
        { status: 401 }
      );
    }

    // Fallback - not authenticated
    return NextResponse.json(
      { error: 'Not authenticated' },
      { status: 401 }
    );

  } catch (error) {
    console.error('Auth check error:', error);
    return NextResponse.json(
      { error: 'Internal server error', authenticated: false },
      { status: 500 }
    );
  }
}