#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Formato vistoso (HTML de Telegram) para el estado de un SAI Delta.
Compatible Python 3.5.
"""

import time

LINEA = "─" * 22


def _esc(texto):
    """Escapa los caracteres que rompen el parse_mode HTML."""
    if texto is None:
        return "—"
    texto = str(texto)
    texto = texto.replace("&", "&amp;")
    texto = texto.replace("<", "&lt;")
    texto = texto.replace(">", "&gt;")
    return texto


def _barra(pct, ancho=10):
    """Barra de bloques a partir de un porcentaje."""
    if pct is None:
        return "░" * ancho
    try:
        pct = int(pct)
    except (TypeError, ValueError):
        return "░" * ancho
    pct = max(0, min(100, pct))
    llenos = int(round(pct * ancho / 100.0))
    return "█" * llenos + "░" * (ancho - llenos)


def _val(v, sufijo=""):
    if v is None:
        return "—"
    return "{0}{1}".format(v, sufijo)


def _duracion(segundos):
    try:
        segundos = int(segundos)
    except (TypeError, ValueError):
        return "—"
    if segundos < 60:
        return "{0} s".format(segundos)
    minutos = segundos // 60
    if minutos < 60:
        return "{0} min {1} s".format(minutos, segundos % 60)
    return "{0} h {1} min".format(minutos // 60, minutos % 60)


def formatear_telegram(d, etiqueta=None, ts=None):
    """ts = momento (epoch) en que se tomaron los datos. None = ahora."""
    nombre = _esc(etiqueta or d.get("nombre") or d.get("host"))
    if ts is None:
        ts = time.time()

    if not d.get("ok"):
        return (
            "\U0001F6D1 <b>{0}</b>\n"
            "<code>{1}</code>\n"
            "Sin respuesta SNMP.\n"
            "Revisa el reenvio de la ONT y la lista NMS."
        ).format(nombre, LINEA)

    # Cabecera segun estado
    if d.get("en_bateria"):
        icono = "\U0001F534"
        titular = "EN BATERIA"
    elif d.get("en_bypass"):
        icono = "\U0001F7E0"
        titular = "EN BYPASS — carga sin proteccion"
    elif d.get("bat_critica"):
        icono = "\U0001F7E0"
        titular = "BATERIA " + _esc(d.get("estado_bat_txt"))
    else:
        icono = "\U0001F7E2"
        titular = _esc(d.get("fuente_txt"))

    bat_pct = d.get("carga_bat_pct")
    carga_pct = d.get("carga_pct")

    L = []
    L.append("{0} <b>{1}</b>".format(icono, nombre))
    L.append("<code>{0}</code>".format(LINEA))
    L.append("⚡ <b>Estado:</b> {0}".format(titular))
    L.append("")

    # Bateria
    L.append("\U0001F50B <b>Bateria</b>  <code>{0}</code> {1}%".format(
        _barra(bat_pct), _val(bat_pct)))
    L.append("     <code>{0} V</code> · {1}".format(
        _val(d.get("tension_bat")), _esc(d.get("estado_bat_txt"))))

    # Carga
    L.append("\U0001F4CA <b>Carga</b>    <code>{0}</code> {1}%".format(
        _barra(carga_pct), _val(carga_pct)))
    if d.get("potencia_w") is not None:
        L.append("     <code>{0} W</code>".format(d.get("potencia_w")))

    L.append("")
    L.append("\U0001F50C <b>Entrada</b>  {0} V · {1} Hz".format(
        _val(d.get("v_entrada")), _val(d.get("f_entrada"))))
    L.append("\U0001F501 <b>Salida</b>   {0} V".format(
        _val(d.get("v_salida"))))

    if d.get("temp_bat") is not None:
        L.append("\U0001F321 <b>Temp bat</b> {0} °C".format(
            d.get("temp_bat")))

    # Bloque extra solo cuando esta descargando
    if d.get("en_bateria"):
        segs = d.get("segs_en_bateria") or 0
        L.append("")
        L.append("<code>{0}</code>".format(LINEA))
        L.append("⏱ <b>Descargando desde hace</b> {0}".format(
            _duracion(segs)))
        L.append("\U0001F4C9 Estimacion del SAI: {0} min".format(
            _val(d.get("minutos_rest"))))
        L.append("<i>La estimacion no es fiable. Guiate por la tension.</i>")

    if d.get("alarmas"):
        L.append("⚠️ <b>Alarmas activas:</b> {0}".format(
            d.get("alarmas")))

    L.append("<code>{0}</code>".format(LINEA))
    L.append("\U0001F552 {0}  ·  cortes de red: {1}".format(
        time.strftime("%d/%m %H:%M:%S", time.localtime(ts)),
        _val(d.get("fallos_red"))))

    return "\n".join(L)
