"""
Tool 2 — Calcul de rentabilité locative.
Calcule la rentabilité brute et nette d'un investissement immobilier.
"""

import json
import logging

logger = logging.getLogger("tools.calculate_profitability")


def _parse(parametre: str) -> dict:
    try:
        return json.loads(parametre)
    except (json.JSONDecodeError, TypeError):
        logger.warning(f"Paramètre non parseable : {parametre!r}")
        return {}


def calculate_profitability(parametre: str) -> dict:
    """
    Calcule la rentabilité locative brute et nette.

    Paramètre JSON :
        {
          "prix":              number,
          "loyer_mensuel":     number,
          "charges_annuelles": number  (défaut 0),
          "taxe_fonciere":     number  (défaut 0),
          "frais_gestion":     number  (défaut 0)
        }

    Formules :
        rentabilite_brute = (loyer_annuel / prix) × 100
        rentabilite_nette = ((loyer_annuel − charges − taxe − frais) / prix) × 100
    """
    data = _parse(parametre)

    prix          = data.get("prix")
    loyer_mensuel = data.get("loyer_mensuel")

    if not prix or not loyer_mensuel:
        return {"erreur": "Les champs 'prix' et 'loyer_mensuel' sont requis."}
    if prix <= 0:
        return {"erreur": "Le prix doit être supérieur à 0."}

    charges = data.get("charges_annuelles", 0)
    taxe    = data.get("taxe_fonciere", 0)
    frais   = data.get("frais_gestion", 0)

    loyer_annuel      = loyer_mensuel * 12
    rentabilite_brute = round((loyer_annuel / prix) * 100, 2)
    revenu_net        = loyer_annuel - charges - taxe - frais
    rentabilite_nette = round((revenu_net / prix) * 100, 2)

    result = {
        "loyer_mensuel":         loyer_mensuel,
        "loyer_annuel":          loyer_annuel,
        "charges_annuelles":     charges,
        "taxe_fonciere":         taxe,
        "frais_gestion":         frais,
        "revenu_net_annuel":     round(revenu_net, 2),
        "rentabilite_brute_pct": rentabilite_brute,
        "rentabilite_nette_pct": rentabilite_nette,
    }
    logger.info(
        f"calculate_profitability → brute={rentabilite_brute}%, nette={rentabilite_nette}%"
    )
    return result
