#!/usr/bin/env python3
"""
Analisa a transcricao Whisper e identifica os melhores momentos para reels.
Usa heurísticas de palavras-chave (Feng Shui, energia, dicas, perguntas)
para marcar segmentos com alto potencial de engajamento.

Saída: cuts_analysis.json com lista de cortes prontos para make_reels.py
"""
import json
import os
import re
import sys
from pathlib import Path

TRANSCRIPT_JSON = "/opt/mia/workspace/clientes/borrello/live_feng_shui_raw/live_audio_90min.json"
OUT_DIR = "/opt/mia/workspace/clientes/borrello/live_feng_shui_cortes/"
CUTS_JSON = os.path.join(OUT_DIR, "cuts_analysis.json")
TRANSCRIPT_TXT = os.path.join(OUT_DIR, "transcript_full.txt")

# Duracao alvo por reel (segundos)
MIN_DUR = 30
MAX_DUR = 58  # deixa 2s de margem pro limite de 60s
TARGET_DUR = 45

# Keywords de alto valor para Feng Shui / Radiestesia
HIGH_VALUE_KEYWORDS = [
    # Ganchos de curiosidade / problema
    "nunca", "jamais", "erro", "errado", "cuidado", "perigo", "atenção", "atenção",
    "segredo", "segredo", "mistério", "misterio",
    # Pratica e dica
    "dica", "dicas", "como fazer", "como colocar", "como posicionar",
    "o que acontece", "o que fazer", "resultado", "funciona",
    "experimente", "tente", "teste",
    # Conceitos Feng Shui
    "energia", "chi", "qi", "fluxo de energia", "bloqueio", "bloqueio de energia",
    "harmonia", "equilibrio", "equilibrio", "positivo", "negativo",
    "bagua", "ba gua", "mapa bagua",
    "cozinha", "quarto", "sala", "banheiro", "entrada", "porta",
    "espelho", "planta", "plantas", "agua", "fontes de agua",
    "cama", "sofá", "mesa", "geladeira",
    "cor", "cores", "vermelho", "amarelo", "verde", "azul",
    "norte", "sul", "leste", "oeste",
    "dinheiro", "prosperidade", "abundância", "abundancia",
    "saúde", "saude", "relacionamento", "amor",
    "purificação", "purificacao", "limpeza energetica",
    # Autoridade / prova social
    "40 anos", "experiência", "experiencia", "estudei", "aprendi",
    "na prática", "na pratica", "funciona mesmo",
    "meus alunos", "cliente", "pessoas",
    # Perguntas retóricas (gancho)
    "você sabia", "voce sabia", "sabia que", "já pensou", "ja pensou",
    "imagine", "o que é", "o que e", "por que", "porque",
]

# Palavras que indicam inicio de resposta a pergunta (bom para reels)
ANSWER_STARTERS = [
    "então", "entao", "veja bem", "olha", "bom,", "na verdade",
    "o que acontece", "deixa eu explicar", "vou explicar",
    "é assim", "e assim", "funciona assim",
]

# Palavras que indicam transicao de topico — bom ponto de corte
TOPIC_TRANSITIONS = [
    "agora vamos falar", "vamos falar sobre", "outro ponto",
    "outra coisa importante", "o segundo", "o terceiro",
    "primeiro", "segundo", "terceiro",
    "passando para", "voltando ao", "pergunta",
]


def load_transcript():
    with open(TRANSCRIPT_JSON) as f:
        data = json.load(f)
    return data.get("segments", [])


def segments_to_text(segments):
    return " ".join(s["text"].strip() for s in segments)


def score_segment(text_lower):
    """Pontuação de relevância para um trecho de texto."""
    score = 0
    for kw in HIGH_VALUE_KEYWORDS:
        if kw in text_lower:
            score += 3
    for kw in ANSWER_STARTERS:
        if text_lower.startswith(kw) or f" {kw}" in text_lower[:50]:
            score += 2
    for kw in TOPIC_TRANSITIONS:
        if kw in text_lower:
            score += 1
    # Penaliza segmentos muito curtos (menos de 5 palavras)
    word_count = len(text_lower.split())
    if word_count < 5:
        score -= 5
    return score


def find_best_cuts(segments, target_count=12):
    """
    Estratégia sliding window:
    1. Agrupa segmentos em janelas de TARGET_DUR segundos
    2. Pontua cada janela
    3. Seleciona as top N sem sobreposição
    """
    if not segments:
        return []

    total_dur = float(segments[-1]["end"])
    print(f"Duracao total transcrita: {total_dur/60:.1f} min")
    print(f"Segmentos: {len(segments)}")

    # Criar janelas candidatas
    windows = []
    step = 15  # avanca 15s por vez

    t = 10.0  # começa em 10s (pula apresentacao)
    while t < total_dur - MIN_DUR:
        # Encontrar segmentos nessa janela
        win_segs = [
            s for s in segments
            if float(s["end"]) > t and float(s["start"]) < t + MAX_DUR
        ]
        if not win_segs:
            t += step
            continue

        # Ajustar fim ao limite de segmento real
        win_start = max(t, float(win_segs[0]["start"]))
        win_end = min(t + MAX_DUR, float(win_segs[-1]["end"]))
        win_dur = win_end - win_start

        if win_dur < MIN_DUR:
            t += step
            continue

        win_text = " ".join(s["text"].strip() for s in win_segs).lower()
        score = score_segment(win_text)

        windows.append({
            "start": win_start,
            "end": min(win_start + TARGET_DUR, win_end),
            "text": win_text[:300],
            "score": score,
        })
        t += step

    # Ordenar por score
    windows.sort(key=lambda w: w["score"], reverse=True)

    # Selecionar sem sobreposição (greedy)
    selected = []
    used_ranges = []

    for w in windows:
        ws, we = w["start"], w["end"]
        # Verificar sobreposição com selecionados
        overlap = any(
            not (we <= us - 5 or ws >= ue + 5)
            for us, ue in used_ranges
        )
        if not overlap:
            selected.append(w)
            used_ranges.append((ws, we))
        if len(selected) >= target_count:
            break

    # Reordenar por timestamp
    selected.sort(key=lambda w: w["start"])
    return selected


def generate_slug(text: str, idx: int) -> str:
    """Gera slug curto baseado no conteudo do trecho."""
    # Palavras-chave para slug
    slug_keywords = {
        "cozinha": "energia-cozinha",
        "quarto": "energia-quarto",
        "sala": "energia-sala",
        "banheiro": "bagua-banheiro",
        "entrada": "entrada-casa",
        "porta": "porta-entrada",
        "espelho": "uso-espelho",
        "planta": "plantas-feng-shui",
        "agua": "agua-prosperidade",
        "cama": "posicao-cama",
        "dinheiro": "prosperidade",
        "abundância": "abundancia",
        "saúde": "saude",
        "amor": "amor-relacionamentos",
        "cor": "cores-feng-shui",
        "vermelho": "cor-vermelha",
        "energia negativa": "energia-negativa",
        "bloqueio": "bloqueio-energetico",
        "limpeza": "limpeza-energetica",
        "norte": "orientacao-norte",
        "bagua": "mapa-bagua",
        "harmonia": "harmonia-lar",
        "prosperidade": "prosperidade",
        "purificação": "purificacao",
        "purificacao": "purificacao",
        "erro": "erro-comum",
        "jamais": "nao-fazer",
        "nunca": "nao-fazer",
    }
    text_lower = text.lower()
    for kw, slug in slug_keywords.items():
        if kw in text_lower:
            return slug
    # Fallback: pega primeiras palavras relevantes
    words = re.findall(r'\b[a-záéíóúãõâêîôûçü]{4,}\b', text_lower)
    if words:
        return "-".join(words[:3])[:40]
    return f"trecho-{idx:02d}"


def generate_gancho(text: str) -> str:
    """Gera sugestao de gancho (primeiros 3s) baseado no conteudo."""
    hooks = {
        "nunca coloque": "Nunca coloque isso na sua cozinha",
        "jamais": "Jamais faça isso em casa",
        "erro que": "O erro que 90% das pessoas cometem",
        "cama": "Onde sua cama está colocada importa muito",
        "espelho": "Espelho no quarto pode ser um problema",
        "entrada": "A entrada da sua casa determina sua energia",
        "energia negativa": "Como eliminar energia negativa de vez",
        "dinheiro": "Por que o dinheiro nao entra na sua vida",
        "abundância": "O segredo da abundancia que poucos sabem",
        "abundancia": "O segredo da abundancia que poucos sabem",
        "agua": "Agua em casa: onde colocar e onde nunca colocar",
        "planta": "Quais plantas atraem energia positiva",
        "cor": "A cor que pode estar bloqueando sua energia",
        "limpeza": "Como fazer limpeza energetica em 5 minutos",
        "bagua": "O mapa que revela a energia de cada cantinho",
        "quarto": "Seu quarto esta configurado para o descanso",
        "sala": "A sala que harmoniza ou bloqueia sua vida",
        "harmonia": "O que faz uma casa ser realmente harmoniosa",
        "prosperidade": "O segredo da prosperidade no Feng Shui",
    }
    text_lower = text.lower()
    for kw, gancho in hooks.items():
        if kw in text_lower:
            return gancho
    # Pega primeira frase como gancho
    sentences = re.split(r'[.!?]', text.strip())
    for s in sentences:
        s = s.strip()
        if len(s) > 20:
            return s[:80] + ("..." if len(s) > 80 else "")
    return text[:80].strip()


def main():
    os.makedirs(OUT_DIR, exist_ok=True)
    print(f"Carregando transcricao: {TRANSCRIPT_JSON}")
    segments = load_transcript()

    if not segments:
        print("ERRO: transcricao vazia ou invalida")
        sys.exit(1)

    # Salvar transcricao completa em TXT para revisao manual
    full_text = ""
    for seg in segments:
        ts = f"[{float(seg['start'])/60:.1f}min] "
        full_text += ts + seg["text"].strip() + "\n"
    with open(TRANSCRIPT_TXT, "w", encoding="utf-8") as f:
        f.write(full_text)
    print(f"Transcricao TXT salva: {TRANSCRIPT_TXT}")

    # Encontrar melhores cortes
    print("\nAnalisando melhores momentos...")
    cuts_raw = find_best_cuts(segments, target_count=12)

    if not cuts_raw:
        print("ERRO: nenhum corte identificado")
        sys.exit(1)

    # Montar lista final de cortes
    cuts = []
    for i, c in enumerate(cuts_raw, 1):
        slug = generate_slug(c["text"], i)
        gancho = generate_gancho(c["text"])
        dur = c["end"] - c["start"]
        cuts.append({
            "idx": i,
            "start": round(c["start"], 2),
            "end": round(c["end"], 2),
            "duration": round(dur, 2),
            "slug": slug,
            "gancho": gancho,
            "score": c["score"],
            "preview_text": c["text"][:200],
        })

    # Salvar
    with open(CUTS_JSON, "w", encoding="utf-8") as f:
        json.dump(cuts, f, indent=2, ensure_ascii=False)

    print(f"\n=== {len(cuts)} CORTES IDENTIFICADOS ===")
    for c in cuts:
        mins = c["start"] / 60
        print(f"\n  [{c['idx']:02d}] {c['slug']}")
        print(f"       Timestamp: {mins:.1f}min | {c['duration']:.0f}s | score={c['score']}")
        print(f"       Gancho: {c['gancho'][:70]}")
        print(f"       Texto: {c['preview_text'][:100]}...")

    print(f"\nCortes salvos: {CUTS_JSON}")
    return cuts


if __name__ == "__main__":
    main()
