"""Resolve readiness and version inventory in one owned Play edit."""
from __future__ import annotations

from dataclasses import dataclass
from pathlib import Path

from play_preflight import opened_edit
from play_preflight_transport import call, fail
import requests


@dataclass(frozen=True)
class PlayInventory:
    ready: bool
    highest_version: int | None


def version_codes(response, kind: str) -> list[int]:
    try:
        payload = response.json()
        if not isinstance(payload, dict) or "error" in payload:
            raise ValueError("invalid inventory")
        rows = payload.get(kind, [])
        if not isinstance(rows, list):
            raise ValueError("invalid inventory")
        values = []
        for row in rows:
            raw = row["versionCode"]
            if isinstance(raw, bool) or not isinstance(raw, (int, str)):
                raise ValueError("invalid version")
            value = int(raw)
            if not 1 <= value <= 2_100_000_000:
                raise ValueError("invalid version")
            values.append(value)
        return values
    except (ValueError, TypeError, KeyError):
        fail("version_inventory", "invalid_response", 1)


def read_inventory(package: str, account: Path) -> PlayInventory:
    with requests.Session() as client, opened_edit(client, package, account) as edit:
        if edit is None:
            return PlayInventory(ready=False, highest_version=None)
        url, headers = edit
        codes = []
        for kind in ("bundles", "apks"):
            response = call("version_inventory", lambda: client.get(f"{url}/{kind}", headers=headers, timeout=30),
                            retry=True, accepted=(200,))
            codes.extend(version_codes(response, kind))
        return PlayInventory(ready=True, highest_version=max(codes) if codes else None)
