"""Firebase Cloud Messaging (FCM) push notifications via firebase-admin."""
import asyncio
from app.config import settings

_firebase_app = None


def _get_app():
    global _firebase_app
    if _firebase_app is not None:
        return _firebase_app

    if not settings.FIREBASE_CREDENTIALS_PATH:
        return None

    try:
        import firebase_admin
        from firebase_admin import credentials

        try:
            _firebase_app = firebase_admin.get_app()
        except ValueError:
            cred = credentials.Certificate(settings.FIREBASE_CREDENTIALS_PATH)
            _firebase_app = firebase_admin.initialize_app(cred)
        return _firebase_app
    except Exception as e:
        print(f"[fcm] Firebase init error: {e}")
        return None


async def send_push(token: str, title: str, body: str, data: dict | None = None) -> bool:
    """
    Send a push notification via FCM.
    Runs firebase-admin (sync) in a thread pool to avoid blocking.
    Returns True on success, False on failure.
    """
    app = _get_app()
    if app is None:
        return False

    def _send():
        from firebase_admin import messaging
        message = messaging.Message(
            notification=messaging.Notification(title=title, body=body),
            data={k: str(v) for k, v in (data or {}).items()},
            token=token,
            android=messaging.AndroidConfig(priority="high"),
            apns=messaging.APNSConfig(
                payload=messaging.APNSPayload(
                    aps=messaging.Aps(sound="default", badge=1)
                )
            ),
        )
        messaging.send(message, app=app)
        return True

    try:
        loop = asyncio.get_event_loop()
        return await loop.run_in_executor(None, _send)
    except Exception as e:
        print(f"[fcm] send error: {e}")
        return False
