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

/**
 * 🔵 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 }
      );
    }

    // Call PHP backend refresh API
    const response = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/api/v1/refresh`, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'Accept': 'application/json',
        'X-API-KEY': process.env.API_KEY || '',
      },
      body: JSON.stringify({
        refresh_token: refreshToken,
      }),
    });

    if (!response.ok) {
      // Refresh token is invalid or expired
      console.warn('⚠️ Token refresh failed - user needs to re-login');

      // Clear both tokens
      const clearAccessToken = 'access_token=; HttpOnly; Secure; SameSite=Strict; Path=/; Max-Age=0';
      const clearRefreshToken = 'refresh_token=; HttpOnly; Secure; SameSite=Strict; 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);

      return failResponse;
    }

    const data = await response.json();

    // Prepare response
    const responseData = {
      message: 'Token refreshed successfully',
      token_type: data.token_type,
      expires_in: data.expires_in,
      expires_at: data.expires_at,
    };

    // Set new HttpOnly cookies
    const accessTokenCookie = [
      `access_token=${data.access_token}`,
      'HttpOnly',
      'Secure',
      'SameSite=Strict',
      'Path=/',
      `Max-Age=${data.expires_in || 7200}`,
    ].join('; ');

    const refreshTokenCookie = [
      `refresh_token=${data.refresh_token}`,
      'HttpOnly',
      'Secure',
      'SameSite=Strict',
      'Path=/',
      'Max-Age=604800', // 7 days
    ].join('; ');

    console.log('✅ Token refresh successful - New tokens stored');

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

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

    return successResponse;

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