"""Lookup Minion — one job: `getPublishedVersion` on BASF.

Consumes: fastlane.tank.allocate.requested
Produces: fastlane.asset.lookup.done   (envelope + fastlane_asset_id/incremental_version | None)
DLQ    : fastlane.asset.lookup.dlq
"""
from __future__ import annotations

import asyncio

from app.config import get_settings
from app.logger import get_logger
from app.services.fastlane_client import FastlaneClient, FastlaneNotFound
from minions._runner import emit, envelope_key, run_minion

log = get_logger("lookup-minion")
_client = FastlaneClient()


async def handle(event: dict) -> None:
    s = get_settings()

    # Client A1/A11 filter: only tank types 311–314 go to BASF.
    allowed = {int(x) for x in s.fastlane_allowed_vehicle_types.split(",") if x.strip()}
    vtype = int(event.get("vehicle_type") or s.fastlane_default_vehicle_type)
    if allowed and vtype not in allowed:
        log.info("SKIP plate=%s type=%s not in %s",
                 event.get("licence_number"), vtype, sorted(allowed))
        return

    asset_id = event.get("fastlane_asset_id")
    inc = None
    if asset_id:
        # ERP already knows the id → trust it, skip the BASF round-trip.
        log.info("ERP supplied asset_id=%s — skipping getPublishedVersion", asset_id)
    else:
        try:
            payload = await _client.get_published_version(
                licence_number=event["licence_number"],
                nationality=event.get("nationality"),
            )
            vehicle = (payload or {}).get("vehicle") or {}
            asset_id = vehicle.get("id")
            inc = vehicle.get("incrementalVersion")
            log.info("HIT plate=%s id=%s v=%s", event["licence_number"], asset_id, inc)
        except FastlaneNotFound:
            log.info("MISS plate=%s — will CREATE", event["licence_number"])
            asset_id = None
            inc = None

    out = dict(event)
    out["event_type"] = s.topic_asset_lookup_done
    out["fastlane_asset_id"] = asset_id
    out["incremental_version"] = inc
    await emit(s.topic_asset_lookup_done, envelope_key(out), out)


async def main() -> None:
    s = get_settings()
    await run_minion(
        name="lookup-minion",
        topic=s.topic_allocate_requested,
        group_id=s.consumer_group_lookup,
        handler=handle,
        dlq_topic=s.topic_lookup_dlq,
    )


if __name__ == "__main__":
    asyncio.run(main())
