import { NextRequest, NextResponse } from 'next/server';
import { verifyReviewer } from '@/lib/auth-middleware';
import { getFirebaseAdmin } from '@/lib/firebase-admin';
import { getFirestore, FieldValue } from 'firebase-admin/firestore';

// POST /api/wiki/entries/{id}/review
export async function POST(
  req: NextRequest,
  { params }: { params: Promise<{ id: string }> }
) {
  // 1. 인증 + reviewer 역할 확인
  const authResult = await verifyReviewer(req);
  if (authResult instanceof NextResponse) return authResult;

  const { id: docId } = await params;

  // 2. 요청 바디 파싱
  let body: { decision: string; comment?: string };
  try {
    body = await req.json();
  } catch {
    return NextResponse.json({ error: 'Invalid JSON body' }, { status: 400 });
  }

  const { decision, comment } = body;

  // 3. 유효성 검증: decision
  const validDecisions = ['approve', 'reject', 'request_revision'];
  if (!decision || !validDecisions.includes(decision)) {
    return NextResponse.json(
      { error: `Invalid decision. Must be one of: ${validDecisions.join(', ')}` },
      { status: 400 }
    );
  }

  // 4. 유효성 검증: 반려/수정요청 시 comment 필수
  if (['reject', 'request_revision'].includes(decision) && (!comment || comment.trim() === '')) {
    return NextResponse.json(
      { error: 'Comment is required for reject or request_revision decisions' },
      { status: 400 }
    );
  }

  // 5. Firestore 작업
  getFirebaseAdmin();
  const db = getFirestore();

  // 문서 존재 확인
  const docRef = db.collection('documents').doc(docId);
  const docSnap = await docRef.get();
  if (!docSnap.exists) {
    return NextResponse.json({ error: 'Document not found' }, { status: 404 });
  }

  const docData = docSnap.data()!;

  // 6. 자기 검토 금지: contributorIds 기반
  const contributorIds: string[] = docData.contributorIds ?? [];
  if (contributorIds.includes(authResult.uid)) {
    return NextResponse.json(
      { error: 'Self-review is not allowed. You are a contributor of this document.' },
      { status: 403 }
    );
  }

  // authorId도 자기 검토 금지
  if (docData.authorId === authResult.uid) {
    return NextResponse.json(
      { error: 'Self-review is not allowed. You are the author of this document.' },
      { status: 403 }
    );
  }

  // 7. 상태 확인: in_review 상태에서만 리뷰 가능
  const status = docData.status ?? 'published';
  if (status !== 'in_review') {
    return NextResponse.json(
      { error: `Document is not in review state. Current status: ${status}` },
      { status: 409 } // Conflict
    );
  }

  // 8. 리뷰어 이름 조회
  const userDoc = await db.collection('users').doc(authResult.uid).get();
  const reviewerName = userDoc.data()?.name ?? userDoc.data()?.displayName ?? 'Unknown';

  // 9. riskLevel 조회/판정
  const riskLevel = docData.riskLevel ?? 'low';

  // 10. 리뷰 문서 생성 (CF 트리거가 상태 전이 처리)
  const reviewRef = docRef.collection('reviews').doc();
  await reviewRef.set({
    id: reviewRef.id,
    docId,
    reviewerId: authResult.uid,
    reviewerName,
    decision,
    comment: comment ?? '',
    riskLevel,
    createdAt: FieldValue.serverTimestamp(),
  });

  return NextResponse.json({
    success: true,
    reviewId: reviewRef.id,
    decision,
    docId,
  });
}
