import { NextRequest, NextResponse } from 'next/server';
import { uploadFileToDrive, findFolder, createFolder, deleteFile } from '@/lib/googleDrive';
import { getAuth } from 'firebase-admin/auth';
import { initializeApp, getApps, cert } from 'firebase-admin/app';

// Initialize Firebase Admin if not already initialized
function initFirebaseAdmin() {
    if (!getApps().length) {
        if (process.env.FIREBASE_SERVICE_ACCOUNT_KEY) {
            initializeApp({
                credential: cert(JSON.parse(process.env.FIREBASE_SERVICE_ACCOUNT_KEY)),
            });
        }
    }
}

export async function POST(req: NextRequest) {
    try {
        // 1. Check Authentication (Verify ID Token)
        const authHeader = req.headers.get('Authorization');
        if (!authHeader?.startsWith('Bearer ')) {
            return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
        }
        const idToken = authHeader.split('Bearer ')[1];

        initFirebaseAdmin();
        let userEmail: string | undefined;
        try {
            const decoded = await getAuth().verifyIdToken(idToken);
            userEmail = decoded.email;
        } catch (error) {
            console.error('Token verification failed:', error);
            return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
        }

        // 2. Parse FormData
        const formData = await req.formData();
        const file = formData.get('file') as File | null;

        if (!file) {
            return NextResponse.json({ error: 'No file uploaded' }, { status: 400 });
        }

        // 3. Prepare File for Drive Upload
        const buffer = Buffer.from(await file.arrayBuffer());
        const rootFolderId = process.env.GOOGLE_DRIVE_FOLDER_ID;

        if (!rootFolderId) {
            console.error('Upload failed: GOOGLE_DRIVE_FOLDER_ID is not defined in environment variables.');
            return NextResponse.json({ error: 'Server configuration error (Folder ID missing)' }, { status: 500 });
        }

        let targetFolderId = rootFolderId;

        // [Feature] Save to User-Specific Folder (e.g. "user@email.com")
        if (userEmail) {
            try {
                // Find existing folder
                const existingFolderId = await findFolder(rootFolderId, userEmail);
                if (existingFolderId) {
                    targetFolderId = existingFolderId;
                } else {
                    // Create new folder if not exists
                    targetFolderId = await createFolder(rootFolderId, userEmail);
                }
            } catch (folderError) {
                console.warn('Failed to find/create user folder, falling back to root folder:', folderError);
                // Keep targetFolderId as rootFolderId
            }
        }

        // 4. Upload to Google Drive (Target Folder)
        const result = await uploadFileToDrive(
            buffer,
            file.name,
            file.type,
            targetFolderId
        );

        return NextResponse.json({
            success: true,
            fileId: result.id,
            name: result.name,
            webViewLink: result.webViewLink,
            webContentLink: result.webContentLink
        });

    } catch (error: any) {
        console.error('Upload error detail:', {
            message: error.message,
            stack: error.stack,
            code: error.code,
            details: error.details
        });
        return NextResponse.json({
            error: 'Internal Server Error',
            message: error.message
        }, { status: 500 });
    }
}

export async function DELETE(req: NextRequest) {
    try {
        // 1. Check Authentication
        const authHeader = req.headers.get('Authorization');
        if (!authHeader?.startsWith('Bearer ')) {
            return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
        }
        const idToken = authHeader.split('Bearer ')[1];

        initFirebaseAdmin();
        try {
            await getAuth().verifyIdToken(idToken);
        } catch (error) {
            return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
        }

        // 2. Parse Body
        const body = await req.json();
        const { fileId } = body;

        if (!fileId) {
            return NextResponse.json({ error: 'Missing fileId' }, { status: 400 });
        }

        // 3. Delete from Drive
        await deleteFile(fileId);

        return NextResponse.json({ success: true });

    } catch (error: any) {
        console.error('Delete error:', error);
        return NextResponse.json({
            error: 'Internal Server Error',
            message: error.message
        }, { status: 500 });
    }
}
