# -*- coding: utf-8 -*-
"""
Integración de API pública -> reporte CSV + correo (simulado)
==============================================================
Demo 3 del Arsenal Freelance.

Flujo típico de automatización:
  1) Consulta una API pública (tasas de cambio del dólar).
  2) Calcula un pequeño reporte (conversión de montos de ejemplo).
  3) Genera un archivo CSV (reporte.csv).
  4) "Envía" el reporte por correo (aquí se SIMULA imprimiéndolo; en real se
     conectaría a SMTP/Telegram con tus credenciales).

Si no hay internet, usa tasas de ejemplo para que la demo siempre corra.

Uso:
    python integracion.py
"""

import csv
import sys
from datetime import datetime

API_URL = "https://api.exchangerate-api.com/v4/latest/USD"
CSV_SALIDA = "reporte.csv"

# Monedas de interés y montos de ejemplo a convertir (en USD)
MONEDAS = ["EUR", "MXN", "CLP", "ARS", "COP", "BRL"]
MONTOS_USD = [100, 500, 1000]

# Tasas de respaldo (aprox.) si la API no responde
TASAS_RESPALDO = {
    "EUR": 0.92, "MXN": 17.1, "CLP": 930.0,
    "ARS": 350.0, "COP": 4100.0, "BRL": 4.95,
}
DESTINATARIO = "dueño@negocio.com"


def obtener_tasas():
    """Devuelve (dict de tasas, fuente_texto)."""
    try:
        import requests
    except ImportError:
        print("[aviso] Falta 'requests'. Instala con: pip install -r requirements.txt")
        return TASAS_RESPALDO, "respaldo (sin librería requests)"

    try:
        resp = requests.get(API_URL, timeout=12)
        resp.raise_for_status()
        data = resp.json()
        tasas = data.get("rates", {})
        if not tasas:
            raise ValueError("respuesta sin tasas")
        return tasas, "API en vivo (%s)" % API_URL
    except Exception as e:
        print("[aviso] No se pudo consultar la API (%s). Uso respaldo." % e)
        return TASAS_RESPALDO, "respaldo (sin conexión)"


def construir_reporte(tasas):
    """Genera filas: [Moneda, Tasa (1 USD), 100 USD, 500 USD, 1000 USD]."""
    encabezados = ["Moneda", "Tasa_por_1_USD"] + ["%d_USD" % m for m in MONTOS_USD]
    filas = []
    for m in MONEDAS:
        tasa = tasas.get(m)
        if tasa is None:
            continue
        fila = [m, round(tasa, 4)] + [round(tasa * monto, 2) for monto in MONTOS_USD]
        filas.append(fila)
    return encabezados, filas


def guardar_csv(encabezados, filas, ruta):
    with open(ruta, "w", newline="", encoding="utf-8-sig") as f:
        w = csv.writer(f)
        w.writerow(encabezados)
        w.writerows(filas)


def enviar_correo_simulado(encabezados, filas, fuente):
    """Simula el envío: imprime el correo que se enviaría (en real: SMTP/Telegram)."""
    print("\n" + "=" * 60)
    print("📧 CORREO SIMULADO (en producción se envía por SMTP o Telegram)")
    print("=" * 60)
    print("Para: %s" % DESTINATARIO)
    print("Asunto: Reporte diario de tasas de cambio — %s" % datetime.now().strftime("%d/%m/%Y"))
    print("-" * 60)
    print("Hola, este es tu reporte automático de tasas (fuente: %s):\n" % fuente)
    print("  " + " | ".join(str(c) for c in encabezados))
    for fila in filas:
        print("  " + " | ".join(str(c) for c in fila))
    print("\nGenerado automáticamente por Arsenal Freelance.")
    print("=" * 60)


def main():
    print("=" * 60)
    print(" Integración de API -> reporte CSV + correo (simulado)")
    print("=" * 60)

    tasas, fuente = obtener_tasas()
    print("[info] Fuente de datos: %s" % fuente)

    encabezados, filas = construir_reporte(tasas)
    guardar_csv(encabezados, filas, CSV_SALIDA)
    print("[ok] Reporte guardado en %s (%d monedas)." % (CSV_SALIDA, len(filas)))

    enviar_correo_simulado(encabezados, filas, fuente)
    print("\nListo. Abre reporte.csv o revisa el correo simulado de arriba.")


if __name__ == "__main__":
    sys.exit(main())
