#!/usr/bin/env python3
"""
responder_comentarios.py — Auto-responder para comentários nos posts @saraiva.ai.

Monitora comentários novos e responde de forma inteligente baseado no conteúdo.
Roda via cron a cada 5 minutos.
"""

import json
import sys
import time
import urllib.request
import urllib.parse
import urllib.error
from datetime import datetime, timedelta
from pathlib import Path

SCRIPT_DIR = Path(__file__).parent.resolve()
CONFIG_PATH = SCRIPT_DIR / "config.json"
LOG_PATH = SCRIPT_DIR / "log-respostas.json"

# Carregar config
with open(CONFIG_PATH, "r", encoding="utf-8") as f:
    CONFIG = json.load(f)

ACCESS_TOKEN = CONFIG["instagram_access_token"]
ACCOUNT_ID = CONFIG["instagram_business_account_id"]

# Palavras-chave que indicam interesse de compra/consultoria
PALAVRAS_LEAD = [
    "sistema", "mentoria", "consultoria", "gargalo", "ajuda",
    "preciso", "como faz", "como funciona", "quanto custa",
    "quero", "interesse", "valor", "preco", "preço",
    "direct", "dm", "chama", "manda"
]

# Palavras que indicam elogio/concordancia
PALAVRAS_ELOGIO = [
    "top", "foda", "brabo", "incrivel", "incrível", "verdade",
    "real", "demais", "parabens", "parabéns", "excelente",
    "genial", "cirurgico", "cirúrgico", "brutal", "pesado",
    "necessario", "necessário", "exato", "isso", "👏", "🔥", "💯"
]

# Respostas para leads (quem quer saber mais)
RESPOSTAS_LEAD = [
    "Opa! Manda um \"SISTEMA\" no meu direct que eu te respondo pessoalmente. Vamos conversar sobre o que ta travando na tua operacao. 🤝",
    "Chega no direct e me conta sua situacao. Eu leio cada mensagem e respondo pessoalmente. Manda \"SISTEMA\" la. 💬",
    "Bora conversar! Manda \"SISTEMA\" no direct que eu te mostro por onde comecar. Cada caso e unico e eu quero entender o seu. 🎯",
]

# Respostas para elogios/concordancia
RESPOSTAS_ELOGIO = [
    "Valeu! Isso vem de quem ja viveu na pele. Se fez sentido, salva e aplica — esse e o diferencial. 🎯",
    "Obrigado! A teoria bonita nao paga conta — o que paga e resolver de verdade. Se precisar de direcao, to no direct. 💬",
    "Boa! Quem reconhece o problema ja ta um passo na frente. O proximo e agir. To por aqui se precisar. 🤝",
    "Isso ai! Se bateu, e porque voce ja vive isso. A boa noticia: tem solucao. Manda \"SISTEMA\" no direct. 🔥",
]

# Respostas para perguntas/duvidas
RESPOSTAS_DUVIDA = [
    "Boa pergunta! Isso merece uma resposta mais profunda do que cabe aqui. Me chama no direct que eu te explico com mais detalhe. 💬",
    "Cara, isso depende do contexto da tua operacao. Manda um \"SISTEMA\" no direct e me conta mais — eu respondo pessoalmente. 🎯",
]

# Resposta genérica
RESPOSTA_GENERICA = [
    "Valeu pelo comentario! Se quiser trocar uma ideia sobre como isso se aplica no seu negocio, to no direct. 🤝",
]


def carregar_log():
    if LOG_PATH.exists():
        with open(LOG_PATH, "r", encoding="utf-8") as f:
            try:
                return json.load(f)
            except json.JSONDecodeError:
                return {"respondidos": [], "leads": []}
    return {"respondidos": [], "leads": []}


def salvar_log(log):
    with open(LOG_PATH, "w", encoding="utf-8") as f:
        json.dump(log, f, ensure_ascii=False, indent=2)


def api_get(endpoint, params=None):
    if params is None:
        params = {}
    params["access_token"] = ACCESS_TOKEN
    url = f"https://graph.facebook.com/v18.0/{endpoint}?{urllib.parse.urlencode(params)}"
    try:
        req = urllib.request.Request(url)
        with urllib.request.urlopen(req, timeout=30) as resp:
            return json.loads(resp.read().decode("utf-8"))
    except urllib.error.HTTPError as e:
        body = e.read().decode("utf-8", errors="replace")
        print(f"[ERRO API GET] {e.code}: {body}", file=sys.stderr)
        return None
    except Exception as e:
        print(f"[ERRO] {e}", file=sys.stderr)
        return None


def api_post(endpoint, params=None):
    if params is None:
        params = {}
    params["access_token"] = ACCESS_TOKEN
    data = urllib.parse.urlencode(params).encode("utf-8")
    url = f"https://graph.facebook.com/v18.0/{endpoint}"
    try:
        req = urllib.request.Request(url, data=data, method="POST")
        with urllib.request.urlopen(req, timeout=30) as resp:
            return json.loads(resp.read().decode("utf-8"))
    except urllib.error.HTTPError as e:
        body = e.read().decode("utf-8", errors="replace")
        print(f"[ERRO API POST] {e.code}: {body}", file=sys.stderr)
        return None
    except Exception as e:
        print(f"[ERRO] {e}", file=sys.stderr)
        return None


def classificar_comentario(texto):
    """Classifica o comentário e retorna tipo + resposta."""
    texto_lower = texto.lower()

    # Check lead keywords first (highest priority)
    for palavra in PALAVRAS_LEAD:
        if palavra in texto_lower:
            idx = hash(texto) % len(RESPOSTAS_LEAD)
            return "lead", RESPOSTAS_LEAD[idx]

    # Check if it's a question
    if "?" in texto:
        idx = hash(texto) % len(RESPOSTAS_DUVIDA)
        return "duvida", RESPOSTAS_DUVIDA[idx]

    # Check elogio
    for palavra in PALAVRAS_ELOGIO:
        if palavra in texto_lower:
            idx = hash(texto) % len(RESPOSTAS_ELOGIO)
            return "elogio", RESPOSTAS_ELOGIO[idx]

    # Se o comentário é muito curto (1-2 palavras), não responde
    if len(texto.split()) <= 2:
        return "curto", None

    # Genérico
    idx = hash(texto) % len(RESPOSTA_GENERICA)
    return "generico", RESPOSTA_GENERICA[idx]


def obter_posts_recentes():
    """Busca os últimos posts publicados."""
    result = api_get(f"{ACCOUNT_ID}/media", {
        "fields": "id,caption,timestamp,comments_count",
        "limit": 10
    })
    if result and "data" in result:
        return result["data"]
    return []


def obter_comentarios(media_id):
    """Busca comentários de um post."""
    result = api_get(f"{media_id}/comments", {
        "fields": "id,text,username,timestamp,from",
        "limit": 50
    })
    if result and "data" in result:
        return result["data"]
    return []


def responder_comentario(comment_id, mensagem):
    """Responde um comentário."""
    result = api_post(f"{comment_id}/replies", {
        "message": mensagem
    })
    return result is not None


def processar():
    log = carregar_log()
    respondidos_ids = set(r["comment_id"] for r in log["respondidos"])

    posts = obter_posts_recentes()
    if not posts:
        print("Nenhum post encontrado.")
        return

    total_respondidos = 0
    total_leads = 0

    for post in posts:
        media_id = post["id"]
        comments_count = post.get("comments_count", 0)

        if comments_count == 0:
            continue

        comentarios = obter_comentarios(media_id)

        for comment in comentarios:
            comment_id = comment["id"]

            # Pular se já respondido
            if comment_id in respondidos_ids:
                continue

            username = comment.get("username", "")
            texto = comment.get("text", "")

            # Não responder a si mesmo
            if username == "saraiva.ai":
                continue

            tipo, resposta = classificar_comentario(texto)

            if resposta is None:
                continue

            print(f"  @{username}: \"{texto[:60]}...\" -> [{tipo}]")

            sucesso = responder_comentario(comment_id, resposta)

            if sucesso:
                registro = {
                    "comment_id": comment_id,
                    "media_id": media_id,
                    "username": username,
                    "texto": texto[:200],
                    "tipo": tipo,
                    "resposta": resposta,
                    "timestamp": datetime.now().isoformat()
                }
                log["respondidos"].append(registro)
                respondidos_ids.add(comment_id)
                total_respondidos += 1

                if tipo == "lead":
                    log["leads"].append({
                        "username": username,
                        "texto": texto[:200],
                        "timestamp": datetime.now().isoformat(),
                        "media_id": media_id
                    })
                    total_leads += 1

                print(f"    -> Respondido! [{tipo}]")

                # Rate limit: espera entre respostas
                time.sleep(3)
            else:
                print(f"    -> FALHA ao responder")

    salvar_log(log)
    print(f"\nResumo: {total_respondidos} respondidos, {total_leads} leads detectados")


if __name__ == "__main__":
    print(f"=== Auto-responder @saraiva.ai | {datetime.now().strftime('%d/%m %H:%M')} ===")
    processar()
