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

// ---------------------------------------------------------------------------
// 상수
// ---------------------------------------------------------------------------

const VALID_REASONS = [
  'factual_error',
  'outdated_info',
  'missing_source',
  'inappropriate_content',
] as const;

type ErrorReason = (typeof VALID_REASONS)[number];

const MAX_MEMO_LENGTH = 200;

// ---------------------------------------------------------------------------
// POST /api/wiki/entries/{id}/error-report
// ---------------------------------------------------------------------------

export async function POST(
  req: NextRequest,
  { params }: { params: Promise<{ id: string }> }
) {
  // 1. 인증: Authorization Bearer token → verifyIdToken
  const authHeader = req.headers.get('Authorization');
  if (!authHeader?.startsWith('Bearer ')) {
    return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
  }
  const idToken = authHeader.split('Bearer ')[1];

  let decoded: Awaited<ReturnType<typeof verifyIdToken>>;
  try {
    decoded = await verifyIdToken(idToken);
  } catch {
    return NextResponse.json({ error: 'Invalid or expired token' }, { status: 401 });
  }

  // 2. 문서 ID 추출
  const { id: docId } = await params;

  // 3. Request body 파싱
  let body: { reason: string; memo?: string };
  try {
    body = await req.json();
  } catch {
    return NextResponse.json({ error: 'Invalid JSON body' }, { status: 400 });
  }

  const { reason, memo } = body;

  // 4. 유효성 검증: reason
  if (!reason || !VALID_REASONS.includes(reason as ErrorReason)) {
    return NextResponse.json(
      {
        error: `reason은 다음 중 하나여야 합니다: ${VALID_REASONS.join(', ')}`,
      },
      { status: 400 }
    );
  }

  // 4-2. 유효성 검증: memo (선택, 최대 200자)
  if (memo !== undefined && memo.length > MAX_MEMO_LENGTH) {
    return NextResponse.json(
      { error: `memo는 최대 ${MAX_MEMO_LENGTH}자까지 허용됩니다.` },
      { 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 errorReportRef = docRef.collection('error_reports').doc();
  await errorReportRef.set({
    reporterId: decoded.uid,
    reporterName: decoded.name || 'Unknown',
    reason: reason as ErrorReason,
    memo: memo ?? '',
    createdAt: FieldValue.serverTimestamp(),
  });

  return NextResponse.json({ success: true, reportId: errorReportRef.id });
}
