"""
Tool 5 — Score d'investissement pondéré.
Calcule un score de 0 (mauvais) à 10 (excellent) selon 4 critères.
"""

import json
import logging

logger = logging.getLogger("tools.investment_score")


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 investment_score(parametre: str) -> dict:
    """
    Score d'investissement pondéré (0 → mauvais, 10 → excellent).

    Paramètre JSON :
        {
          "rentabilite_brute": number,  # % (ex: 4.5)
          "statut_marche":     string,  # "sous-évalué" | "prix marché" | "surévalué"
          "demande_locative":  string,  # "faible" | "moyenne" | "forte" | "très forte"
          "risque":            string   # "faible" | "moyen" | "élevé" (défaut "moyen")
        }

    Pondération :
        rentabilité    40 %
        prix marché    30 %
        demande        20 %
        risque         10 %
    """
    data = _parse(parametre)

    rentabilite = data.get("rentabilite_brute", 0)
    statut      = data.get("statut_marche",    "prix marché").lower()
    demande     = data.get("demande_locative", "moyenne").lower()
    risque      = data.get("risque",           "moyen").lower()

    # Score rentabilité (0–10)
    if rentabilite >= 7:
        score_renta = 10.0
    elif rentabilite >= 5:
        score_renta = round(6 + (rentabilite - 5) * 2, 1)
    elif rentabilite >= 3:
        score_renta = round(3 + (rentabilite - 3) * 1.5, 1)
    else:
        score_renta = max(0.0, round(rentabilite, 1))

    score_marche  = {"sous-évalué": 9, "prix marché": 6, "surévalué": 2}.get(statut, 5)
    score_demande = {"très forte": 10, "forte": 8, "moyenne": 5, "faible": 2}.get(demande, 5)
    score_risque  = {"faible": 9, "moyen": 6, "élevé": 2}.get(risque, 5)

    score_final = round(
        score_renta   * 0.40
        + score_marche  * 0.30
        + score_demande * 0.20
        + score_risque  * 0.10,
        1,
    )

    if score_final >= 8:
        niveau = "excellent"
    elif score_final >= 6:
        niveau = "bon"
    elif score_final >= 4:
        niveau = "correct"
    elif score_final >= 2:
        niveau = "faible"
    else:
        niveau = "mauvais"

    result = {
        "score":  score_final,
        "niveau": niveau,
        "details": {
            "rentabilite":      score_renta,
            "prix_marche":      score_marche,
            "demande_locative": score_demande,
            "risque":           score_risque,
        },
        "poids": {
            "rentabilite":      "40%",
            "prix_marche":      "30%",
            "demande_locative": "20%",
            "risque":           "10%",
        },
    }
    logger.info(f"investment_score → score={score_final}/10, niveau={niveau}")
    return result
