"""Python 3.10+, sin dependencias: python3 calcular_coste.py presupuesto.json"""
import json
import math
import sys


def calcular(p):
    claves = ["tareas_mes", "fraccion_resuelta", "entrada_sin_cache_por_tarea",
              "entrada_cache_por_tarea", "salida_por_tarea", "usd_millon_entrada",
              "usd_millon_cache", "usd_millon_salida", "hosting_usd", "herramientas_usd",
              "fraccion_escalada", "minutos_por_escalado", "usd_hora_humana"]
    for clave in claves:
        valor = p[clave]
        if isinstance(valor, bool) or not isinstance(valor, (int, float)) or not math.isfinite(valor) or valor < 0:
            raise ValueError(f"{clave}: usa un número finito no negativo")
    if not 0 < p["fraccion_resuelta"] <= 1 or not 0 <= p["fraccion_escalada"] <= 1:
        raise ValueError("Fracciones fuera de rango; resuelta debe ser mayor que cero")
    if p["tareas_mes"] <= 0:
        raise ValueError("tareas_mes debe ser mayor que cero")
    inferencia = p["tareas_mes"] / 1_000_000 * (
        p["entrada_sin_cache_por_tarea"] * p["usd_millon_entrada"] +
        p["entrada_cache_por_tarea"] * p["usd_millon_cache"] +
        p["salida_por_tarea"] * p["usd_millon_salida"])
    horas = p["tareas_mes"] * p["fraccion_escalada"] * p["minutos_por_escalado"] / 60
    total = inferencia + p["hosting_usd"] + p["herramientas_usd"] + horas * p["usd_hora_humana"]
    return {"inferencia_usd": round(inferencia, 2), "horas_humanas": round(horas, 2),
            "total_usd": round(total, 2),
            "usd_por_tarea_resuelta": round(total / (p["tareas_mes"] * p["fraccion_resuelta"]), 4)}


if __name__ == "__main__":
    with open(sys.argv[1], encoding="utf-8") as archivo:
        print(json.dumps(calcular(json.load(archivo)), ensure_ascii=False, indent=2))
