"""Enriquecimento em segundo plano das empresas acabadas de criar.

Ao criar uma empresa o formulário só espera pela consulta rápida; o resto —
CAE do SICAE, morada do VIES — corre logo a seguir, sem bloquear o utilizador.

O job diário `refresh_nif` apanha o que ficar por preencher.
"""
import asyncio
import json
import logging

from sqlalchemy import text

from app.db import AsyncSessionLocal
from app.services.nif_lookup import lookup_nif

logger = logging.getLogger(__name__)


async def _enrich_company(company_id: str, nif: str) -> None:
    data = await lookup_nif(nif)
    if data.get("source") == "local":
        logger.info("enrichment: sem dados externos para nif=%s", nif)
        return
    async with AsyncSessionLocal() as session:
        await session.execute(
            text(
                """
                UPDATE companies SET
                  cae        = COALESCE(cae, :cae),
                  address    = COALESCE(NULLIF(address, ''), :addr),
                  legal_name = COALESCE(NULLIF(legal_name, ''), :legal),
                  ptdata_payload = CAST(:pl AS JSONB),
                  ptdata_fetched_at = now(),
                  updated_at = now()
                WHERE id = :id
                """
            ),
            {
                "id": company_id,
                "cae": data.get("cae"),
                "addr": data.get("address"),
                "legal": data.get("legal_name"),
                "pl": json.dumps(data.get("raw")) if data.get("raw") else None,
            },
        )
        await session.commit()
    logger.info(
        "enrichment: %s nif=%s fonte=%s cae=%s",
        company_id, nif, data.get("source"), data.get("cae"),
    )


def schedule_enrichment(company_id: str, nif: str) -> None:
    """Fire-and-forget na loop em execução."""
    try:
        loop = asyncio.get_running_loop()
    except RuntimeError:
        return
    loop.create_task(_enrich_company(company_id, nif))
