"""
Firebase Admin SDK client — Firestore + Auth initialization.
Single shared instance used across the entire application.
"""
import logging
from pathlib import Path
from google.cloud import firestore
from google.oauth2 import service_account
import firebase_admin
from firebase_admin import credentials

import core.config as cfg

logger = logging.getLogger("chatbot.database")

# ── Firebase Admin SDK Initialization ─────────────────────────────────────────
_firebase_app = None

def _init_firebase_admin():
    global _firebase_app
    if _firebase_app is not None:
        return  # Already initialized

    key_path = Path(cfg.GOOGLE_APPLICATION_CREDENTIALS)
    if key_path.exists():
        cred = credentials.Certificate(str(key_path))
        _firebase_app = firebase_admin.initialize_app(cred)
        logger.info("Firebase Admin SDK initialized with service account credentials.")
    else:
        # Attempt with Application Default Credentials (Cloud Run, GKE, etc.)
        try:
            _firebase_app = firebase_admin.initialize_app()
            logger.info("Firebase Admin SDK initialized with Application Default Credentials.")
        except Exception as e:
            logger.critical(f"Firebase Admin SDK initialization failed: {e}")

_init_firebase_admin()

# ── Firestore Client ───────────────────────────────────────────────────────────
db_client = None

try:
    logger.info("Initializing Firestore Client...")
    client_kwargs: dict = {"database": cfg.FIRESTORE_DATABASE}

    if cfg.GOOGLE_CLOUD_PROJECT:
        client_kwargs["project"] = cfg.GOOGLE_CLOUD_PROJECT

    key_path = Path(cfg.GOOGLE_APPLICATION_CREDENTIALS)
    if key_path.exists():
        client_kwargs["credentials"] = service_account.Credentials.from_service_account_file(
            str(key_path)
        )

    db_client = firestore.Client(**client_kwargs)
    logger.info("Firestore Client initialized successfully.")

except Exception as e:
    logger.critical(f"Firestore Client initialization failed: {e}")
    db_client = None


def get_firestore() -> firestore.Client:
    """FastAPI dependency: returns the active Firestore client."""
    if db_client is None:
        raise RuntimeError("Firestore client is not initialized.")
    return db_client
