# -*- coding: utf-8 -*-
"""
Parche: bot.py publica tambien en Mattermost y atiende comandos con '!'.

Telegram NO se toca: sigue funcionando igual. Esto es la fase en paralelo.

Hace tres cosas:
  1. import mattermost (opcional: si falta, el bot va como siempre)
  2. send() duplica a Mattermost cuando el destino es una alerta, y
     enruta a Mattermost cuando el destino es el centinela MM_CHAT.
     edit() no hace nada con MM_CHAT (Mattermost no edita asi).
  3. Un hilo escucha el canal y mapea !los, !cajas, !status, !api, !onts
     a las mismas funciones cmd_* que usa Telegram.

Idempotente: si ya esta aplicado, avisa y no toca nada.
"""
from __future__ import print_function

import io
import os
import sys

RUTA = "/home/gor/snmp/smartolt/bot.py"
if len(sys.argv) > 1:
    RUTA = sys.argv[1]

s = io.open(RUTA, encoding="utf-8").read()

if "import mattermost" in s:
    raise SystemExit("El parche ya estaba aplicado. No se toca nada.")

# --- 1. import -------------------------------------------------------
ANCLA_IMPORT = "try:\n    import telefonos\nexcept ImportError:\n    telefonos = None\n"
if ANCLA_IMPORT not in s:
    raise SystemExit("No encuentro el bloque 'import telefonos'. Aborto.")

NUEVO_IMPORT = ANCLA_IMPORT + """
# Transporte Mattermost, en paralelo con Telegram. Opcional: si falta el
# modulo o las credenciales, el bot funciona como siempre solo con Telegram.
try:
    import mattermost
except ImportError:
    mattermost = None

# Centinela de destino: send(MM_CHAT, ...) publica en Mattermost en vez
# de en Telegram. Permite reutilizar las funciones cmd_* tal cual.
MM_CHAT = "__mattermost__"
"""
s = s.replace(ANCLA_IMPORT, NUEVO_IMPORT, 1)

# --- 2. send() y edit() ----------------------------------------------
SEND_VIEJO = '''def send(chat, text, reply_markup=None):
    p = {"chat_id": chat, "text": text[:4096], "parse_mode": "Markdown",
         "protect_content": True}
    if reply_markup:
        p["reply_markup"] = reply_markup
    tg("sendMessage", p)
'''
if SEND_VIEJO not in s:
    raise SystemExit("send() no coincide con lo esperado. Aborto.")

SEND_NUEVO = '''def send(chat, text, reply_markup=None):
    # Destino Mattermost: no pasa por Telegram. Los botones de Telegram
    # (reply_markup) no existen alli, se ignoran.
    if chat == MM_CHAT:
        if mattermost:
            mattermost.publicar(text)
        return

    p = {"chat_id": chat, "text": text[:4096], "parse_mode": "Markdown",
         "protect_content": True}
    if reply_markup:
        p["reply_markup"] = reply_markup
    tg("sendMessage", p)

    # Fase en paralelo: las alertas automaticas salen por los dos sitios.
    # Las respuestas a comandos de Telegram no se duplican, para no llenar
    # el canal de Mattermost con cosas que alguien pidio en Telegram.
    if mattermost and chat in ALERT_TARGETS:
        mattermost.publicar(text)
'''
s = s.replace(SEND_VIEJO, SEND_NUEVO, 1)

EDIT_VIEJO = '''def edit(chat, msg_id, text, reply_markup=None):
    p = {"chat_id"'''
EDIT_NUEVO = '''def edit(chat, msg_id, text, reply_markup=None):
    # Mattermost no tiene el concepto de editar un mensaje por id como
    # Telegram; los comandos que editan simplemente no editan alli.
    if chat == MM_CHAT:
        return
    p = {"chat_id"'''
if EDIT_VIEJO not in s:
    raise SystemExit("edit() no coincide con lo esperado. Aborto.")
s = s.replace(EDIT_VIEJO, EDIT_NUEVO, 1)

# --- 3. manejador y arranque del hilo --------------------------------
MAIN_VIEJO = '''    get_onus_fresh()
    threading.Thread(target=loop_monitor, daemon=True).start()
    poll()'''
if MAIN_VIEJO not in s:
    raise SystemExit("El bloque main no coincide. Aborto.")

MANEJADOR = '''
# ============================================================
# COMANDOS DESDE MATTERMOST
# ============================================================

def comando_mattermost(texto, autor_id, post_id):
    """
    Traduce '!x' al cmd_x correspondiente. Se reutilizan las mismas
    funciones que atienden a Telegram: se les pasa MM_CHAT como destino
    y send() se encarga de enrutar.

    La autorizacion aqui la da la pertenencia al canal de Mattermost, que
    es mas fino que el filtro por chat_id de Telegram.
    """
    orden = texto.strip().split()[0].lower()
    tabla = {
        "!start":  cmd_start,
        "!onts":   cmd_onts,
        "!status": cmd_status,
        "!cajas":  cmd_cajas,
        "!los":    cmd_los,
        "!api":    cmd_api,
    }
    funcion = tabla.get(orden)
    if not funcion:
        return "Comando no reconocido. Disponibles: " + ", ".join(sorted(tabla))
    funcion(MM_CHAT)
    return None   # cmd_* ya publica por su cuenta


def loop_mattermost():
    """Hilo de escucha. Si Mattermost falla, reconecta solo; el resto del
    bot sigue funcionando pase lo que pase aqui."""
    try:
        mattermost.escuchar(comando_mattermost)
    except Exception:
        log.error("Hilo de Mattermost muerto.", exc_info=True)


'''

MAIN_NUEVO = '''    get_onus_fresh()
    threading.Thread(target=loop_monitor, daemon=True).start()
    if mattermost and mattermost.configurado():
        threading.Thread(target=loop_mattermost, daemon=True).start()
        log.info("Mattermost activo en paralelo con Telegram.")
    else:
        log.info("Mattermost no configurado: solo Telegram.")
    poll()'''

# El manejador va antes del bloque MAIN.
ANCLA_MAIN = '''# ============================================================
# MAIN
# ============================================================'''
if ANCLA_MAIN not in s:
    raise SystemExit("No encuentro la cabecera MAIN. Aborto.")
s = s.replace(ANCLA_MAIN, MANEJADOR.lstrip("\n") + ANCLA_MAIN, 1)
s = s.replace(MAIN_VIEJO, MAIN_NUEVO, 1)

io.open(RUTA, "w", encoding="utf-8", newline="\n").write(s)
print("Parche aplicado sobre %s" % RUTA)
print("Comprueba con: python3 -m py_compile %s" % RUTA)
