#!/usr/bin/env python3
"""Enhance the trending analysis with LLM-style categorization and better HTML."""
import json, os, re, html as html_module, sys

def strip_html(text):
    if not text: return ""
    text = re.sub(r'<[^>]+>', '', text)
    text = html_module.unescape(text)
    return text.strip()

def format_stars(n):
    if n >= 1000:
        return f"{n/1000:.1f}k" if n % 1000 != 0 else f"{n//1000}k"
    return str(n)

def get_category(repo):
    name = repo['name'].lower()
    desc = repo.get('description', '').lower()
    readme = strip_html(repo.get('readme', '')).lower()[:2000]
    all_text = desc + " " + readme
    
    # Specific overrides
    if 'bitchat' in name: return 'IoT'
    if 'amnezia' in name: return 'Segurança'
    if 'imgui' in name: return 'Frontend/UI'
    if 'superfile' in name: return 'Ferramentas Dev'
    if 'jenkins' in name: return 'Infra/DevOps'
    if 'cassandra' in name: return 'Dados/Análise'
    if 'mediacrawler' in name: return 'Dados/Análise'
    if 'kronos' in name: return 'IA/ML'
    if 'impeccable' in name: return 'Frontend/UI'
    if 'geolibre' in name: return 'Dados/Análise'
    if 'claude-video' in name: return 'Mídia/Criativo'
    if 'ag-kit' in name: return 'Ferramentas Dev'
    if 'last30days' in name: return 'Ferramentas Dev'
    if 'airi' in name: return 'IA/ML'
    if 'open-code-review' in name: return 'Ferramentas Dev'
    
    keywords = {
        'IA/ML': ['ai', 'machine learning', 'llm', 'neural', 'foundation model', 'artificial intelligence'],
        'Ferramentas Dev': ['developer tool', 'cli', 'code review', 'library', 'framework', 'terminal', 'file manager'],
        'Infra/DevOps': ['docker', 'deploy', 'infrastructure', 'devops', 'vpn', 'server', 'automation server'],
        'Segurança': ['security', 'privacy', 'encrypt', 'vpn', 'decentralized', 'mesh'],
        'Mídia/Criativo': ['video', 'design', 'creative', 'media', 'animation'],
        'Dados/Análise': ['data', 'database', 'analytics', 'crawler', 'distributed'],
        'Frontend/UI': ['ui', 'gui', 'interface', 'design'],
    }
    
    scores = {}
    for cat, kws in keywords.items():
        score = sum(1 for kw in kws if kw in all_text)
        if score > 0: scores[cat] = score
    return max(scores, key=scores.get) if scores else 'Ferramentas Dev'

cat_emoji = {
    'IA/ML': '🤖', 'Ferramentas Dev': '🛠️', 'Infra/DevOps': '☁️',
    'Segurança': '🔒', 'Mídia/Criativo': '🎨', 'Dados/Análise': '📊',
    'Frontend/UI': '🎯', 'IoT': '🔗', 'Outro': '📦'
}

analysis = {
    'permissionlesstech/bitchat': {
        'problem': 'Comunicação descentralizada sem internet, servidores ou número de telefone — usa mesh Bluetooth para off-line e protocolo Nostr para alcance global.',
        'advantages': [
            'Transporte duplo: mesh Bluetooth (offline) + Nostr (internet) com roteamento inteligente',
            'Privacidade total: sem contas, sem telefone, sem servidores centrais',
            'Criptografia ponta-a-ponta via Noise Protocol nas mensagens privadas',
            'Canais baseados em localização geográfica no Nostr',
            'Descoberta automática de peers e relay multi-hop na rede mesh'
        ]},
    'amnezia-vpn/amnezia-client': {
        'problem': 'VPN auto-hospedada que simplifica a configuração no próprio servidor com múltiplos protocolos e ofuscação de tráfego para contornar censura.',
        'advantages': [
            'Auto-deploy: informe IP e senha SSH, o Amnezia instala e configura tudo automaticamente',
            'Múltiplos protocolos: OpenVPN, WireGuard, IKEv2 + ofuscação com Cloak e Shadowsocks',
            'Split tunneling: escolha sites ou apps que passam pela VPN',
            'Disponível para Windows, macOS, Linux, Android e iOS',
            'Site espelho para regiões com bloqueio governamental'
        ]},
    'moeru-ai/airi': {
        'problem': 'Companhia AI auto-hospedada inspirada na Neuro-sama — personagem virtual com voz em tempo real que interage em jogos como Minecraft e Factorio.',
        'advantages': [
            'Auto-hospedado: você controla a IA sem depender de serviços externos',
            'Voz em tempo real com baixa latência',
            'Integração com Minecraft, Factorio e outros jogos',
            'Suporte multiplataforma: Web, macOS e Windows',
            'Personagem customizável — container de almas de waifu digital'
        ]},
    'opengeos/GeoLibre': {
        'problem': 'Plataforma GIS gratuita, leve e cloud-native para visualizar e analisar dados geoespaciais — roda no navegador, desktop, mobile e Jupyter, mantendo dados locais.',
        'advantages': [
            'Multiplataforma: web, desktop (Tauri v2), mobile e Jupyter notebooks',
            'Privacidade: tudo processado localmente, sem envio para servidores',
            'Plugins e compartilhamento via geolibre.app/share',
            'Disponível como pacote Python (pip/conda), app Microsoft Store e Flatpak',
            'Construído com React + TypeScript — performance nativa'
        ]},
    'yorukot/superfile': {
        'problem': 'Gerenciador de arquivos moderno e bonito para o terminal — substitui ranger/lf com interface visualmente atraente e cheia de recursos.',
        'advantages': [
            'Interface moderna e visualmente atraente no terminal',
            'Suporte nativo a macOS, Linux e Windows',
            'Instalação simplificada via Homebrew, Winget, Scoop e mais',
            'Hotkeys intuitivas para navegação eficiente',
            'Comunidade ativa com mais de 21k estrelas'
        ]},
    'NanmiCoder/MediaCrawler': {
        'problem': 'Crawler unificado que extrai posts, comentários e vídeos de 7+ plataformas de mídia social chinesas (小红书, Douyin, Kuaishou, Bilibili, Weibo, Tieba, Zhihu).',
        'advantages': [
            'Suporte a 7+ plataformas chinesas num único crawler',
            'Extrai posts, comentários, respostas e vídeos',
            'Código aberto com foco educacional (58k+ estrelas)',
            'Comunidade grande e ativa com contribuições frequentes',
            'Patrocinado por BrowserAct para captura em larga escala'
        ]},
    'pbakaus/impeccable': {
        'problem': 'Linguagem de design que faz agentes de IA gerarem interfaces melhores — substitui o visual genérico SaaS por design profissional com 60 regras e 23 comandos.',
        'advantages': [
            '60 regras determinísticas de detector + checagens LLM para qualidade de design',
            '23 comandos (/polish, /audit, /critique, /animate, etc.)',
            'Setup único (/impeccable init) que define identidade visual do projeto',
            'CLI e extensão de browser rodam sem LLM para regras determinísticas',
            'Elimina os tells genéricos: Inter, gradientes roxos, cards aninhados'
        ]},
    'shiyu-coder/Kronos': {
        'problem': 'Modelo fundacional (foundation model) especializado na linguagem dos mercados financeiros — analisa dados de ações, tendências e indicadores econômicos.',
        'advantages': [
            'Modelo fundacional treinado especificamente para linguagem financeira',
            'Disponível no HuggingFace para download e fine-tuning',
            'Demo online interativa disponível',
            'Suporte a múltiplos idiomas incluindo português',
            'Potencial para análise técnica e automatizada de mercado'
        ]},
    'alibaba/open-code-review': {
        'problem': 'Ferramenta de code review open-source testada na escala do Alibaba — combina regras determinísticas com LLM para detectar NPE, XSS, SQL injection e bugs de thread-safety.',
        'advantages': [
            'Arquitetura híbrida: pipelines determinísticos + LLM Agent',
            'Comentários precisos no nível da linha de código',
            'Regras built-in para NPE, thread-safety, XSS e SQL injection',
            'Compatível com OpenAI e Anthropic como backend LLM',
            'Gratuito e open-source — testado na escala do Alibaba'
        ]},
    'jenkinsci/jenkins': {
        'problem': 'Servidor de automação open-source líder para CI/CD — automatiza builds, testes e deploys com mais de 2.000 plugins disponíveis.',
        'advantages': [
            'Ecossistema imenso: mais de 2.000 plugins para qualquer ferramenta',
            'Maduro e estável: anos de uso em produção globalmente',
            'Pipeline as Code: pipelines definidos em Jenkinsfile versionado',
            'Suporte a qualquer linguagem ou framework via plugins',
            'LTS e versões regulares com suporte de longo prazo'
        ]},
    'bradautomates/claude-video': {
        'problem': 'Dá ao Claude a capacidade de "assistir" vídeos — baixa, extrai frames com consciência de cena, transcreve áudio e entrega tudo para análise.',
        'advantages': [
            'Análise completa: frames + transcrição com timestamps',
            'Detecção inteligente de cenas para extração relevante de frames',
            'Usa legendas gratuitas quando disponíveis (fallback Whisper API)',
            'Instalação zero-config — yt-dlp e ffmpeg instalam na primeira execução',
            'Compatível com Claude Code, Codex, Cursor, Copilot e 50+ hosts agent'
        ]},
    'vudovn/ag-kit': {
        'problem': 'Kit de engenharia de agentes "antigravity-first" com regras, skills, agentes especialistas, workflows, memória persistente e orquestração.',
        'advantages': [
            'Workspace .agents/ completo com regras, skills, workflows e memória',
            '20 definições de papéis para roteamento inteligente entre especialistas',
            'Memória persistente com compressão de contexto',
            'Orquestração de agentes com hooks de segurança nativos',
            'Primeiro runtime: Google Antigravity com checklist de produção'
        ]},
    'apache/cassandra': {
        'problem': 'Banco de dados distribuído transactional com escalabilidade linear e tolerância a falhas em hardware commodity ou nuvem — sem single point of failure.',
        'advantages': [
            'Escalabilidade linear: adicione nós e ganhe performance proporcional',
            'Tolerância a falhas comprovada em produção global',
            'Particionamento automático ao adicionar/remover máquinas',
            'CQL: linguagem familiar para quem conhece SQL',
            'Usado por milhares de empresas incluindo Apple, Netflix e Instagram'
        ]},
    'mvanhorn/last30days-skill': {
        'problem': 'Skill para agentes de IA que pesquisa qualquer tópico nos últimos 30 dias em Reddit, X, YouTube, HN, Polymarket — ranqueia por engajamento real.',
        'advantages': [
            'Busca em múltiplas fontes: Reddit, X, YouTube, HN, Polymarket, TikTok',
            'Ranqueamento por upvotes, likes e odds com dinheiro real',
            'Zero config para fontes básicas — setup wizard de 30s',
            'Skill v3 com suporte a Claude Code, Codex, Cursor e 50+ hosts',
            'Síntese com citações: cada claim tem fonte verificável'
        ]},
    'ocornut/imgui': {
        'problem': 'Biblioteca GUI bloat-free para C++ em modo imediato — ideal para ferramentas dev, debuggers, editores e aplicações com requisitos de performance.',
        'advantages': [
            'Modo imediato: sem callbacks, estado da UI recriado a cada frame',
            'Mínimas dependências: integração trivial em qualquer projeto C++',
            'Performance excepcional para ferramentas e tempo real',
            '75k+ estrelas — uma das bibliotecas C++ mais populares do GitHub',
            'Ecossistema rico: bindings para múltiplas linguagens e backends gráficos'
        ]}
}

def main():
    if len(sys.argv) < 2:
        print("Usage: enhance_trending.py <json_path>")
        sys.exit(1)
    
    with open(sys.argv[1]) as f:
        data = json.loads(f.read())
    
    today = data['date']
    repos = data['repos']
    
    # HTML generation
    html = '''<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>GitHub Trending — ''' + today + '''</title>
<style>
*{margin:0;padding:0;box-sizing:border-box}
body{background:#0d1117;color:#c9d1d9;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;padding:2rem 1rem;min-height:100vh}
h1{font-size:1.8rem;margin-bottom:.3rem;color:#58a6ff}
.sub{color:#8b949e;margin-bottom:1.5rem;font-size:.9rem}
.nav-top{margin-bottom:1.5rem}
.nav-top a{color:#58a6ff;text-decoration:none;font-size:.9rem}
.nav-top a:hover{text-decoration:underline}
.stats-bar{display:flex;flex-wrap:wrap;gap:1rem;margin-bottom:1.5rem;padding:1rem;background:#161b22;border:1px solid #30363d;border-radius:8px}
.stat-item{text-align:center;flex:1;min-width:100px}
.stat-item .num{font-size:1.5rem;font-weight:700;color:#58a6ff;display:block}
.stat-item .label{font-size:.75rem;color:#8b949e;text-transform:uppercase}
.grid{display:grid;gap:1.2rem}
.card{background:#161b22;border:1px solid #30363d;border-radius:8px;padding:1.2rem;position:relative;transition:border-color .2s,border-width .1s}
.card:hover{border-color:#58a6ff;border-width:1.5px}
.rank{position:absolute;top:.6rem;right:.8rem;font-size:.75rem;color:#484f58;font-weight:600}
.card-header{margin-bottom:.6rem;padding-right:1.8rem}
.card-header h3{font-size:1.1rem;display:inline}
.card-header h3 a{color:#58a6ff;text-decoration:none}
.card-header h3 a:hover{text-decoration:underline}
.stars-count{display:inline-block;margin-left:.6rem;font-size:.85rem;color:#d29922;font-weight:500}
.card-body{font-size:.85rem;line-height:1.5}
.meta-row{display:flex;flex-wrap:wrap;gap:.4rem;margin-bottom:.8rem;align-items:center}
.tag{background:#1f2937;color:#c9d1d9;padding:.15rem .5rem;border-radius:12px;font-size:.75rem}
.category{background:#0d419d;color:#58a6ff;padding:.15rem .5rem;border-radius:12px;font-size:.75rem}
.section{margin-bottom:.6rem}
.section strong{color:#f0f6fc;display:block;margin-bottom:.2rem}
.section p{color:#8b949e}
.advantages{margin-top:.6rem}
.advantages strong{color:#f0f6fc;display:block;margin-bottom:.2rem}
.advantages ul{margin:.2rem 0 0 1.2rem;color:#8b949e}
.advantages li{margin-bottom:.15rem}
.footer{margin-top:1.5rem;padding-top:.8rem;border-top:1px solid #21262d;color:#484f58;text-align:center;font-size:.8rem}
.footer a{color:#484f58}
@media(min-width:768px){.grid{grid-template-columns:repeat(2,1fr)}}
@media(min-width:1100px){.grid{grid-template-columns:repeat(3,1fr)}}
</style>
</head>
<body>
<div class="nav-top"><a href="index.html">← Home</a></div>
<h1>🔥 GitHub Trending — ''' + today + '''</h1>
<p class="sub">Análise inteligente dos ''' + str(len(repos)) + ''' repositórios mais populares do dia</p>
<div class="stats-bar">
  <div class="stat-item"><span class="num">''' + str(len(repos)) + '''</span><span class="label">Repositórios</span></div>
  <div class="stat-item"><span class="num">''' + format_stars(sum(r['stars'] for r in repos)) + '''</span><span class="label">⭐ Estrelas Totais</span></div>
  <div class="stat-item"><span class="num">''' + str(len(set(r['language'] for r in repos if r.get('language')))) + '''</span><span class="label">Linguagens</span></div>
  <div class="stat-item"><span class="num">''' + str(len(set(get_category(r) for r in repos))) + '''</span><span class="label">Categorias</span></div>
</div>
<div class="grid">'''
    
    for repo in repos:
        rank = repo['rank']
        name = repo['name']
        url = repo['url']
        lang = repo.get('language', 'N/A')
        stars = repo['stars']
        cat = get_category(repo)
        emoji = cat_emoji.get(cat, '📦')
        a = analysis.get(name, {'problem': repo.get('description', 'Projeto em destaque.'), 'advantages': ['Projeto open-source com grande adoção da comunidade.']})
        
        problem_text = html_module.escape(a['problem'])
        
        html += f'''
    <div class="card">
      <div class="rank">#{rank}</div>
      <div class="card-header">
        <h3><a href="{url}" target="_blank" rel="noopener">{html_module.escape(name)}</a></h3>
        <span class="stars-count">⭐ {format_stars(stars)}</span>
      </div>
      <div class="card-body">
        <div class="meta-row">
          <span class="tag">{html_module.escape(lang)}</span>
          <span class="category">{emoji} {cat}</span>
        </div>
        <div class="section">
          <strong>📋 Problema que resolve:</strong>
          <p>{problem_text}</p>
        </div>
        <div class="advantages"><strong>🌟 Vantagens:</strong><ul>'''
        for adv in a['advantages']:
            html += f'          <li>{html_module.escape(adv)}</li>\n'
        html += '''        </ul></div>
      </div>
    </div>'''
    
    html += '''</div>
<div class="footer">Gerado por Hermes Agent · <a href="https://github.com/trending">github.com/trending</a></div>
</body>
</html>'''
    
    out_dir = os.path.expanduser('~/.hermes/landing')
    os.makedirs(out_dir, exist_ok=True)
    out_path = os.path.join(out_dir, f'{today}.html')
    with open(out_path, 'w') as f:
        f.write(html)
    
    print(f"✅ Enhanced HTML: {out_path}")
    
    # Telegram summary
    total_stars = sum(r['stars'] for r in repos)
    cat_counts = {}
    for r in repos:
        c = get_category(r)
        cat_counts[c] = cat_counts.get(c, 0) + 1
    
    print("\n\n=== TELEGRAM_MSG ===")
    print(f"🔥 **GitHub Trending — {today}**\n")
    print(f"📊 {len(repos)} repositórios · {total_stars:,} ★ totais\n")
    
    for repo in repos:
        name = repo['name']
        url = repo['url']
        lang = repo.get('language', 'N/A')
        stars = repo['stars']
        cat = get_category(repo)
        emoji = cat_emoji.get(cat, '📦')
        a = analysis.get(name, {'problem': repo.get('description', ''), 'advantages': []})
        problem = a['problem'][:100].replace('\n', ' ')
        if len(a['problem']) > 100: problem += '...'
        adv = a['advantages'][0] if a['advantages'] else ''
        
        print(f"**#{repo['rank']} {name}**")
        print(f"`{lang}` ⭐{format_stars(stars)} {emoji} {cat}")
        print(f"└ {problem}")
        if adv:
            print(f"  ✔ {adv}")
        print()

if __name__ == '__main__':
    main()
