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

import { prisma } from '@/lib/prisma';

export async function GET(request: NextRequest) {
    try {
        const url = new URL(request.url);
        const isPinecone = url.searchParams.get('pinecone') === 'true';
        
        const generalDocuments = await prisma.generalDocument.findMany();
        const firmDocuments = await prisma.firmDocument.findMany();

        const generalDocs = generalDocuments.flatMap((genDoc) => {
            if (!genDoc.document || !Array.isArray(genDoc.document)) {
                return [];
            }
            
            return genDoc.document.map((item: any) => {
                if (isPinecone) {
                    return {
                        _id: `gen_${item.metadata?.id || Math.random().toString(36).substr(2, 9)}`,
                        chunk_text: item.page_content || "",
                        type: item.metadata?.type || "دانشنامه",
                        categories: item.metadata?.categories || [],
                        keywords: item.metadata?.keywords || ""
                    };
                }
                
                return {
                    page_content: item.page_content,
                    metadata: item.metadata
                };
            });
        });

        const firmDocs = firmDocuments.map((firmDoc) => {
            if (!firmDoc.fields || !Array.isArray(firmDoc.fields)) {
                if (isPinecone) {
                    return {
                        _id: `firm_${firmDoc.id || ""}`,
                        chunk_text: firmDoc.name || "",
                        type: "پراپ_فرم_ها",
                        categories: [],
                        keywords: ""
                    };
                }
                
                return {
                    page_content: firmDoc.name || '',
                    metadata: {
                        id: firmDoc.id,
                        name: firmDoc.name,
                        categories: [],
                        fields: {},
                        type: "پراپ_فرم_ها",
                    }
                };
            }

            const categories: Record<string, any> = {};
            firmDoc.fields.forEach((field: any) => {
                if (!categories[field.category]) {
                    categories[field.category] = {};
                }
                categories[field.category][field.key] = field.value;
            });

            const content = firmDoc.fields
                .map((field: any) => `${field.key}: ${field.value}`)
                .join(' | ');
                
            if (isPinecone) {
                // تمام کلیدهای فیلدها را به عنوان keywords استفاده می‌کنیم
                const keywords = firmDoc.fields.map((field: any) => field.key).join(', ');
                
                return {
                    _id: `firm_${firmDoc.id}`,
                    chunk_text: `${firmDoc.name} { ${content} }`,
                    type: "پراپ_فرم_ها",
                    categories: Object.keys(categories),
                    keywords: keywords
                };
            }

            return {
                page_content: `${firmDoc.name} { ${content} }`,
                metadata: {
                    id: firmDoc.id,
                    name: firmDoc.name,
                    categories: Object.keys(categories),
                    fields: categories,
                    type: "پراپ_فرم_ها",
                }
            };
        });

        const combinedDocs = [...generalDocs, ...firmDocs];

        // تغییر فرمت خروجی بر اساس پارامتر pinecone
        if (isPinecone) {
            return NextResponse.json(combinedDocs); // آرایه برگردانده می‌شود
        } else {
            return NextResponse.json({ documents: combinedDocs }); // آبجکت با کلید documents برگردانده می‌شود
        }
    } catch (error) {
        console.error('Error processing documents:', error);
        return NextResponse.json(
            { error: 'Failed to process documents' },
            { status: 500 }
        );
    }
}