import 'server-only';
import * as admin from 'firebase-admin';

function formatPrivateKey(key: string) {
    return key.replace(/\\n/g, '\n');
}

export function getFirebaseAdmin() {
    if (admin.apps.length > 0) {
        return admin.app();
    }

    const serviceAccountKey = process.env.FIREBASE_SERVICE_ACCOUNT_KEY;

    // Support single JSON variable (Vercel friendly)
    if (serviceAccountKey) {
        try {
            const serviceAccount = JSON.parse(serviceAccountKey);
            return admin.initializeApp({
                credential: admin.credential.cert(serviceAccount),
            });
        } catch (error) {
            console.error('Failed to parse FIREBASE_SERVICE_ACCOUNT_KEY:', error);
        }
    }

    const projectId = process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID;
    const clientEmail = process.env.FIREBASE_CLIENT_EMAIL;
    const privateKey = process.env.FIREBASE_PRIVATE_KEY;

    if (!projectId || !clientEmail || !privateKey) {
        console.warn('Firebase Admin credentials are not fully set. Using Mock for build.');
        // Mock object for build time
        return {
            firestore: () => ({
                collection: (_: string) => ({
                    doc: (_: string) => ({
                        get: async () => ({ exists: false, data: () => undefined }),
                    }),
                }),
            }),
        } as any;
    }

    return admin.initializeApp({
        credential: admin.credential.cert({
            projectId,
            clientEmail,
            privateKey: formatPrivateKey(privateKey),
        }),
    });
}

export const adminDb = getFirebaseAdmin().firestore();

/**
 * Firebase ID Token 검증 헬퍼
 * Authorization: Bearer <token> 에서 추출된 토큰을 검증한다.
 */
export async function verifyIdToken(token: string) {
    getFirebaseAdmin();
    const { getAuth } = await import('firebase-admin/auth');
    return getAuth().verifyIdToken(token);
}
