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

const API_BASE_URL = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:8001';

// GET /api/jobs/[jobId]/compare?previous=<previousJobId>
// Returns reviews from current job with a flag indicating if they're new
export async function GET(
  request: NextRequest,
  { params }: { params: Promise<{ jobId: string }> }
) {
  try {
    const { jobId } = await params;
    const { searchParams } = new URL(request.url);
    const previousJobId = searchParams.get('previous');

    // Fetch current job reviews
    const currentResponse = await fetch(`${API_BASE_URL}/jobs/${jobId}/reviews?limit=10000`);
    if (!currentResponse.ok) {
      const errorText = await currentResponse.text().catch(() => '');
      console.error(`Failed to get current job reviews: ${currentResponse.status} - ${errorText}`);
      return NextResponse.json(
        { error: `Failed to get reviews for job ${jobId} (${currentResponse.status})` },
        { status: currentResponse.status }
      );
    }
    const currentData = await currentResponse.json();
    const currentReviews = currentData.reviews || [];

    // If no previous job to compare, all reviews are "new"
    if (!previousJobId) {
      const reviewsWithStatus = currentReviews.map((review: Record<string, unknown>) => ({
        ...review,
        is_new: true,
      }));
      return NextResponse.json({
        reviews: reviewsWithStatus,
        total_count: reviewsWithStatus.length,
        new_count: reviewsWithStatus.length,
        previous_job_id: null,
      });
    }

    // Fetch previous job reviews
    const previousResponse = await fetch(`${API_BASE_URL}/jobs/${previousJobId}/reviews?limit=10000`);
    if (!previousResponse.ok) {
      // Previous job not found, treat all as new
      const reviewsWithStatus = currentReviews.map((review: Record<string, unknown>) => ({
        ...review,
        is_new: true,
      }));
      return NextResponse.json({
        reviews: reviewsWithStatus,
        total_count: reviewsWithStatus.length,
        new_count: reviewsWithStatus.length,
        previous_job_id: previousJobId,
      });
    }

    const previousData = await previousResponse.json();
    const previousReviews = previousData.reviews || [];

    // Create a Set of previous review IDs for O(1) lookup
    const previousReviewIds = new Set(
      previousReviews.map((r: { review_id: string }) => r.review_id)
    );

    // Mark reviews as new if they weren't in the previous job
    const reviewsWithStatus = currentReviews.map((review: { review_id: string }) => ({
      ...review,
      is_new: !previousReviewIds.has(review.review_id),
    }));

    const newCount = reviewsWithStatus.filter((r: { is_new: boolean }) => r.is_new).length;

    return NextResponse.json({
      reviews: reviewsWithStatus,
      total_count: reviewsWithStatus.length,
      new_count: newCount,
      previous_job_id: previousJobId,
    });
  } catch (error) {
    console.error('Compare API error:', error);
    return NextResponse.json(
      { error: 'Failed to compare reviews' },
      { status: 500 }
    );
  }
}
