import { NextRequest, NextResponse } from 'next/server';
import { getAuth } from 'firebase-admin/auth';
import { getFirebaseAdmin } from '@/lib/firebase-admin';
import { ADMIN_EMAILS } from '@/lib/constants';

async function verifyAdmin(req: NextRequest): Promise<{ email: string } | NextResponse> {
    const authHeader = req.headers.get('Authorization');
    if (!authHeader?.startsWith('Bearer ')) {
        return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
    }
    const idToken = authHeader.split('Bearer ')[1];
    getFirebaseAdmin();
    let userEmail: string | undefined;
    try {
        const decoded = await getAuth().verifyIdToken(idToken);
        userEmail = decoded.email;
    } catch {
        return NextResponse.json({ error: 'Unauthorized: Invalid token' }, { status: 401 });
    }
    if (!userEmail || !ADMIN_EMAILS.includes(userEmail)) {
        return NextResponse.json({ error: 'Forbidden: Admin only' }, { status: 403 });
    }
    return { email: userEmail };
}

// GET /api/admin/insurance/terms
// 모든 insurance_metadata 목록 + 최신 summary_jobs 상태 조인
export async function GET(req: NextRequest) {
    try {
        const authResult = await verifyAdmin(req);
        if (authResult instanceof NextResponse) return authResult;

        const db = getFirebaseAdmin().firestore();

        // 1. 모든 insurance_metadata 조회
        const metaSnapshot = await db
            .collection('insurance_metadata')
            .where('isActive', '==', true)
            .orderBy('updatedAt', 'desc')
            .get();

        const metadataList = metaSnapshot.docs.map((doc: any) => ({
            id: doc.id,
            ...doc.data(),
            createdAt: doc.data().createdAt?.toDate?.()?.toISOString() ?? null,
            updatedAt: doc.data().updatedAt?.toDate?.()?.toISOString() ?? null,
        }));

        // 2. 각 productId에 대한 최신 summary_job 조회 (pending/processing/complete/failed)
        const productIds = metadataList.map((m: any) => m.productId).filter(Boolean);

        const summaryJobMap: Record<string, any> = {};
        if (productIds.length > 0) {
            // Firestore IN query는 30개 제한 — 배치 처리
            const chunkSize = 30;
            for (let i = 0; i < productIds.length; i += chunkSize) {
                const chunk = productIds.slice(i, i + chunkSize);
                const jobSnapshot = await db
                    .collection('summary_jobs')
                    .where('productId', 'in', chunk)
                    .orderBy('createdAt', 'desc')
                    .get();

                jobSnapshot.docs.forEach((doc: any) => {
                    const data = doc.data();
                    const pid = data.productId;
                    // 최신 job만 유지
                    if (!summaryJobMap[pid]) {
                        summaryJobMap[pid] = {
                            id: doc.id,
                            status: data.status,
                            chunksCount: data.chunksCount ?? 0,
                            error: data.error,
                            createdAt: data.createdAt?.toDate?.()?.toISOString() ?? null,
                            updatedAt: data.updatedAt?.toDate?.()?.toISOString() ?? null,
                        };
                    }
                });
            }
        }

        // 3. 조인
        const products = metadataList.map((meta: any) => ({
            metadata: meta,
            summaryJob: summaryJobMap[meta.productId] ?? null,
        }));

        return NextResponse.json({ products });
    } catch (error: any) {
        console.error('GET /api/admin/insurance/terms error:', error);
        return NextResponse.json({ error: 'Internal Server Error', message: error.message }, { status: 500 });
    }
}
