"""Client minimal de l'API Ghostfolio — valeur du portefeuille (lecture seule).

Flux Ghostfolio : POST /api/v1/auth/anonymous {accessToken} → JWT, puis
GET /api/v1/portfolio/details (Bearer) → summary.currentValueInBaseCurrency.

Le token (« Security token » du compte Ghostfolio) est config-driven, jamais en
dur. Sans token → message d'aide ; toute erreur → message parlable, jamais d'exception.
"""

from __future__ import annotations

from typing import Any


def _fmt_money(value: float) -> str:
    """12345.6 → « 12 345 » (séparateur de milliers fin, arrondi à l'euro)."""
    try:
        return f"{round(float(value)):,}".replace(",", " ")
    except (TypeError, ValueError):
        return str(value)


class GhostfolioClient:
    def __init__(self, cfg: dict[str, Any]):
        self.url = (cfg.get("url") or "http://ghostfolio.lab.local").rstrip("/")
        self.token = cfg.get("access_token") or ""
        self.timeout = float(cfg.get("timeout_sec", 6) or 6)

    def _auth_token(self) -> str | None:
        import requests

        r = requests.post(
            f"{self.url}/api/v1/auth/anonymous",
            json={"accessToken": self.token}, timeout=self.timeout,
        )
        if r.status_code >= 400:
            return None
        return (r.json() or {}).get("authToken")

    def _base_currency(self) -> str:
        import requests

        try:
            r = requests.get(f"{self.url}/api/v1/info", timeout=self.timeout)
            return (r.json() or {}).get("baseCurrency") or "EUR"
        except (requests.RequestException, ValueError):
            return "EUR"

    def value_summary(self) -> str:
        """Phrase parlable donnant la valeur du portefeuille (ou un message d'erreur clair)."""
        import requests

        if not self.token:
            return ("Je n'ai pas de jeton Ghostfolio configuré. "
                    "Ajoute ton « Security token » dans la section ghostfolio de la config.")
        try:
            jwt = self._auth_token()
            if not jwt:
                return "Je n'arrive pas à m'authentifier auprès de Ghostfolio — le jeton est peut-être invalide."
            r = requests.get(
                f"{self.url}/api/v1/portfolio/details",
                headers={"Authorization": f"Bearer {jwt}"}, timeout=self.timeout,
            )
            r.raise_for_status()
            summary = (r.json() or {}).get("summary", {}) or {}
            val = (summary.get("currentValueInBaseCurrency")
                   or summary.get("currentValue")
                   or summary.get("netWorth"))
            if val is None:
                return "Je n'ai pas trouvé la valeur du portefeuille dans la réponse de Ghostfolio."
            cur = self._base_currency()
            return f"Ton portefeuille Ghostfolio vaut environ {_fmt_money(val)} {cur}."
        except requests.RequestException:
            return "Ghostfolio est injoignable pour le moment."
        except (ValueError, KeyError):
            return "Réponse inattendue de Ghostfolio — je n'ai pas pu lire la valeur."
