from __future__ import annotations

import json
from dataclasses import dataclass
from typing import Final


INITIALIZE_REQUEST: Final[str] = (
    '{"id":1,"method":"initialize","params":{"clientInfo":{"name":"codex-tray","version":"1.0"}}}\n'
)
RATE_LIMITS_REQUEST: Final[str] = '{"id":2,"method":"account/rateLimits/read","params":{}}\n'


@dataclass(frozen=True)
class RateLimitsReply:
    is_error: bool
    primary_used_pct: int | None
    secondary_used_pct: int | None


class CodexAppServer:
    def request_lines(self) -> tuple[str, str]:
        return INITIALIZE_REQUEST, RATE_LIMITS_REQUEST

    def parse_rate_limits_response(self, line: str) -> RateLimitsReply | None:
        try:
            payload = json.loads(line)
        except json.JSONDecodeError:
            return None

        if not isinstance(payload, dict) or payload.get("id") != 2:
            return None

        if "error" in payload:
            return RateLimitsReply(
                is_error=True,
                primary_used_pct=None,
                secondary_used_pct=None,
            )

        result = payload.get("result")
        if not isinstance(result, dict):
            return None

        rate_limits = result.get("rateLimits")
        if not isinstance(rate_limits, dict):
            rate_limits = result

        return RateLimitsReply(
            is_error=False,
            primary_used_pct=self._extract_used_percent(rate_limits.get("primary")),
            secondary_used_pct=self._extract_used_percent(rate_limits.get("secondary")),
        )

    @staticmethod
    def _extract_used_percent(window: object) -> int | None:
        if not isinstance(window, dict):
            return None
        used_percent = window.get("usedPercent")
        return used_percent if isinstance(used_percent, int) else None
