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

/**
 * 🔵 Next.js 내부 API - 토큰 갱신 프록시 (PHP 백엔드로 전달)
 *
 * ⚡ 설계 목적:
 * - 자동 토큰 갱신: access_token 만료 시 재로그인 없이 세션 유지
 * - 보안: refresh_token을 HttpOnly 쿠키에서 읽어 백엔드로 전달
 * - 사용자 경험: 끊김없는 사용 (2시간마다 자동 갱신)
 *
 * 🔄 동작 흐름:
 * 1. 클라이언트 → Next.js /api/auth/refresh
 * 2. Next.js: HttpOnly 쿠키에서 refresh_token 읽기
 * 3. Next.js → PHP /api/v1/refresh (새 토큰 요청)
 * 4. PHP → Next.js (새 access_token, refresh_token)
 * 5. Next.js: 새 토큰을 HttpOnly 쿠키로 업데이트
 * 6. Next.js → 클라이언트 (갱신 성공 응답)
 *
 * 📍 호출 시점:
 * - /api/auth/check에서 access_token 없을 때 자동 호출
 * - API 호출 시 401 응답 받을 때 (withTokenRefresh 헬퍼)
 * - 미들웨어에서 토큰 만료 감지 시
 *
 * 🔐 보안 특징:
 * - Token Rotation: 갱신 시 새로운 refresh_token도 발급
 * - HttpOnly: 토큰이 JavaScript에 노출되지 않음
 * - 자동 만료: access_token 2시간, refresh_token 7일
 *
 * ⚠️ 주의:
 * - 이 API는 PHP /api/v1/refresh의 프록시입니다
 * - refresh_token 만료 시 재로그인 필요 (401 응답)
 */
export async function POST(request: NextRequest) {
  try {
    // Get refresh_token from HttpOnly cookie
    const refreshToken = request.cookies.get('refresh_token')?.value;

    if (!refreshToken) {
      return NextResponse.json(
        { error: 'No refresh token available' },
        { status: 401 }
      );
    }

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

    const isProduction = process.env.NODE_ENV === 'production';

    if (!refreshResult.success || !refreshResult.accessToken) {
      // Refresh token is invalid or expired
      console.warn('⚠️ [api/auth/refresh] Token refresh failed - user needs to re-login');

      // Clear all tokens
      const clearAccessToken = `access_token=; HttpOnly; ${isProduction ? 'Secure; ' : ''}SameSite=Lax; Path=/; Max-Age=0`;
      const clearRefreshToken = `refresh_token=; HttpOnly; ${isProduction ? 'Secure; ' : ''}SameSite=Lax; Path=/; Max-Age=0`;
      const clearIsAuthenticated = `is_authenticated=; ${isProduction ? 'Secure; ' : ''}SameSite=Lax; Path=/; Max-Age=0`;

      const failResponse = NextResponse.json(
        { error: 'Token refresh failed', needsReauth: true },
        { status: 401 }
      );

      failResponse.headers.append('Set-Cookie', clearAccessToken);
      failResponse.headers.append('Set-Cookie', clearRefreshToken);
      failResponse.headers.append('Set-Cookie', clearIsAuthenticated);

      return failResponse;
    }

    // Prepare response
    const responseData = {
      message: 'Token refreshed successfully',
      expires_in: refreshResult.expiresIn,
    };

    // Set new HttpOnly cookies
    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', // 7 days
    ].join('; ');

    // ✅ FCM 등에서 인증 상태 확인용 (non-HttpOnly)
    const isAuthenticatedCookie = [
      'is_authenticated=true',
      ...(isProduction ? ['Secure'] : []),
      'SameSite=Lax',
      'Path=/',
      `Max-Age=${refreshResult.expiresIn || 7200}`,
    ].join('; ');


    const successResponse = NextResponse.json(responseData, { status: 200 });

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

    return successResponse;

  } catch (error) {
    console.error('Token refresh error:', error);
    return NextResponse.json(
      { error: 'Internal server error' },
      { status: 500 }
    );
  }
}
