#!/usr/bin/env python3
"""
🐍 OPHION - Gerador de Manual PDF
"""

from fpdf import FPDF
from datetime import datetime
import os

class OphionManualPDF(FPDF):
    def __init__(self):
        super().__init__()
        self.set_auto_page_break(auto=True, margin=15)
        # Adicionar fonte Unicode
        self.add_font('DejaVu', '', '/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf', uni=True)
        self.add_font('DejaVu', 'B', '/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf', uni=True)
        self.add_font('DejaVuMono', '', '/usr/share/fonts/truetype/dejavu/DejaVuSansMono.ttf', uni=True)
        
    def header(self):
        self.set_font('DejaVu', 'B', 10)
        self.set_text_color(100, 100, 100)
        self.cell(0, 10, 'OPHION - Manual de Instalação', new_x='RIGHT', new_y='TOP')
        self.cell(0, 10, f'v1.0 | {datetime.now().strftime("%d/%m/%Y")}', new_x='LMARGIN', new_y='NEXT', align='R')
        self.line(10, 18, 200, 18)
        self.ln(5)
        
    def footer(self):
        self.set_y(-15)
        self.set_font('DejaVu', '', 8)
        self.set_text_color(128, 128, 128)
        self.cell(0, 10, f'Página {self.page_no()}/{{nb}}', new_x='RIGHT', new_y='TOP', align='C')
        
    def titulo(self, texto):
        self.set_font('DejaVu', 'B', 18)
        self.set_text_color(75, 0, 130)
        self.cell(0, 15, texto, new_x='LMARGIN', new_y='NEXT')
        self.ln(2)
        
    def subtitulo(self, texto):
        self.set_font('DejaVu', 'B', 14)
        self.set_text_color(50, 50, 50)
        self.cell(0, 10, texto, new_x='LMARGIN', new_y='NEXT')
        self.ln(1)
        
    def subtitulo2(self, texto):
        self.set_font('DejaVu', 'B', 12)
        self.set_text_color(70, 70, 70)
        self.cell(0, 8, texto, new_x='LMARGIN', new_y='NEXT')
        
    def paragrafo(self, texto):
        self.set_font('DejaVu', '', 11)
        self.set_text_color(0, 0, 0)
        self.multi_cell(0, 6, texto)
        self.ln(2)
        
    def codigo(self, texto):
        self.set_font('DejaVuMono', '', 9)
        self.set_fill_color(245, 245, 245)
        self.set_text_color(0, 100, 0)
        self.multi_cell(0, 5, texto, fill=True)
        self.ln(3)
        
    def item(self, texto, bullet="-"):
        self.set_font('DejaVu', '', 11)
        self.set_text_color(0, 0, 0)
        self.cell(8, 6, bullet, new_x='RIGHT', new_y='TOP')
        self.multi_cell(0, 6, texto)
        
    def alerta(self, texto):
        self.set_fill_color(255, 243, 205)
        self.set_font('DejaVu', 'B', 10)
        self.set_text_color(133, 100, 4)
        self.cell(0, 8, f'[!] {texto}', new_x='LMARGIN', new_y='NEXT', fill=True)
        self.ln(2)
        
    def sucesso(self, texto):
        self.set_fill_color(212, 237, 218)
        self.set_font('DejaVu', 'B', 10)
        self.set_text_color(21, 87, 36)
        self.cell(0, 8, f'[OK] {texto}', new_x='LMARGIN', new_y='NEXT', fill=True)
        self.ln(2)

def gerar_manual():
    pdf = OphionManualPDF()
    pdf.alias_nb_pages()
    
    # ========== CAPA ==========
    pdf.add_page()
    pdf.ln(40)
    pdf.set_font('DejaVu', 'B', 36)
    pdf.set_text_color(75, 0, 130)
    pdf.cell(0, 20, 'OPHION', new_x='LMARGIN', new_y='NEXT', align='C')
    
    pdf.set_font('DejaVu', '', 16)
    pdf.set_text_color(100, 100, 100)
    pdf.cell(0, 10, 'Open Source Observability Platform', new_x='LMARGIN', new_y='NEXT', align='C')
    pdf.cell(0, 10, 'AI-Powered Monitoring', new_x='LMARGIN', new_y='NEXT', align='C')
    
    pdf.ln(20)
    pdf.set_font('DejaVu', 'B', 20)
    pdf.set_text_color(50, 50, 50)
    pdf.cell(0, 15, 'Manual de Instalação', new_x='LMARGIN', new_y='NEXT', align='C')
    
    pdf.ln(40)
    pdf.set_font('DejaVu', '', 12)
    pdf.set_text_color(128, 128, 128)
    pdf.cell(0, 8, f'Versão 1.0 | Fevereiro 2026', new_x='LMARGIN', new_y='NEXT', align='C')
    pdf.cell(0, 8, 'https://ophion.com.br', new_x='LMARGIN', new_y='NEXT', align='C')
    
    # ========== ÍNDICE ==========
    pdf.add_page()
    pdf.titulo('Índice')
    
    indice = [
        ('1. Visão Geral', 3),
        ('2. Requisitos do Sistema', 3),
        ('3. Instalação Rápida', 4),
        ('4. Instalação Manual', 5),
        ('5. Configuração', 7),
        ('6. Instalação do Agent', 9),
        ('7. Primeiros Passos', 11),
        ('8. Comandos CLI', 12),
        ('9. Segurança', 13),
        ('10. Troubleshooting', 14),
        ('11. Suporte', 15),
    ]
    
    for item, pag in indice:
        pdf.set_font('DejaVu', '', 12)
        pdf.cell(160, 8, item, new_x='RIGHT', new_y='TOP')
        pdf.cell(0, 8, str(pag), new_x='LMARGIN', new_y='NEXT', align='R')
    
    # ========== 1. VISÃO GERAL ==========
    pdf.add_page()
    pdf.titulo('1. Visão Geral')
    
    pdf.paragrafo('OPHION é uma plataforma de observabilidade open source que combina métricas, logs e traces com inteligência artificial para monitoramento proativo de infraestrutura.')
    
    pdf.subtitulo('Principais Recursos')
    pdf.item('Métricas de sistema (CPU, RAM, Disco, Rede)')
    pdf.item('Coleta e análise de logs centralizados')
    pdf.item('Distributed tracing para microserviços')
    pdf.item('OPHION Copilot - Chat com IA especialista')
    pdf.item('Auto-Healing - Correção automática de problemas')
    pdf.item('Smart Alerts - Alertas inteligentes sem ruído')
    pdf.item('Predictions - Previsões de capacidade')
    
    pdf.ln(5)
    pdf.subtitulo('Stack Tecnológico')
    pdf.item('Backend: Go (Fiber)')
    pdf.item('Frontend: Next.js 14 + TypeScript')
    pdf.item('Banco de dados: PostgreSQL + ClickHouse')
    pdf.item('Cache: Redis')
    pdf.item('IA: OpenAI GPT-4')
    
    # ========== 2. REQUISITOS ==========
    pdf.add_page()
    pdf.titulo('2. Requisitos do Sistema')
    
    pdf.subtitulo('Requisitos Mínimos')
    pdf.item('CPU: 2 cores')
    pdf.item('RAM: 4 GB')
    pdf.item('Disco: 20 GB SSD')
    pdf.item('OS: Ubuntu 20.04+ / Debian 11+ / CentOS 8+')
    
    pdf.ln(3)
    pdf.subtitulo('Requisitos Recomendados (Produção)')
    pdf.item('CPU: 4+ cores')
    pdf.item('RAM: 8+ GB')
    pdf.item('Disco: 100+ GB SSD')
    pdf.item('OS: Ubuntu 22.04 LTS')
    
    pdf.ln(3)
    pdf.subtitulo('Software Necessário')
    pdf.item('Docker 24.0+')
    pdf.item('Docker Compose 2.0+')
    pdf.item('curl, git (para instalação)')
    
    pdf.ln(3)
    pdf.subtitulo('Portas Utilizadas')
    pdf.codigo('8080  - API REST\n3000  - Dashboard Web\n5432  - PostgreSQL (interno)\n9000  - ClickHouse (interno)\n6379  - Redis (interno)')
    
    # ========== 3. INSTALAÇÃO RÁPIDA ==========
    pdf.add_page()
    pdf.titulo('3. Instalação Rápida')
    
    pdf.paragrafo('A forma mais fácil de instalar o OPHION é usando nosso instalador interativo:')
    
    pdf.codigo('curl -fsSL https://get.ophion.io | bash')
    
    pdf.paragrafo('O instalador irá:')
    pdf.item('Verificar os requisitos do sistema')
    pdf.item('Coletar informações da sua empresa')
    pdf.item('Gerar credenciais seguras automaticamente')
    pdf.item('Configurar todos os serviços')
    pdf.item('Iniciar a plataforma')
    
    pdf.ln(3)
    pdf.subtitulo('Informações Solicitadas')
    pdf.item('Nome da empresa/organização')
    pdf.item('Email do administrador')
    pdf.item('Senha do administrador (mín. 8 caracteres)')
    pdf.item('Domínio (opcional, padrão: localhost)')
    pdf.item('Portas do servidor e dashboard')
    pdf.item('Configuração do Telegram para alertas (opcional)')
    
    pdf.ln(3)
    pdf.alerta('IMPORTANTE: Guarde a API Key exibida ao final da instalação!')
    
    # ========== 4. INSTALAÇÃO MANUAL ==========
    pdf.add_page()
    pdf.titulo('4. Instalação Manual')
    
    pdf.subtitulo('4.1 Instalar Docker')
    pdf.codigo('# Ubuntu/Debian\nsudo apt update\nsudo apt install -y curl\ncurl -fsSL https://get.docker.com | sh\nsudo usermod -aG docker $USER')
    
    pdf.alerta('Faça logout e login novamente após adicionar o usuário ao grupo docker.')
    
    pdf.subtitulo('4.2 Baixar OPHION')
    pdf.codigo('git clone https://github.com/bigtux/ophion.git\ncd ophion')
    
    pdf.subtitulo('4.3 Configurar Variáveis de Ambiente')
    pdf.codigo('cp .env.example .env\nnano .env')
    
    pdf.paragrafo('Edite as seguintes variáveis:')
    pdf.codigo('ORG_NAME="Sua Empresa"\nADMIN_EMAIL=admin@empresa.com\nADMIN_PASSWORD=senha-forte-aqui\nDOMAIN=ophion.empresa.com\nJWT_SECRET=$(openssl rand -hex 32)')
    
    pdf.add_page()
    pdf.subtitulo('4.4 Iniciar os Serviços')
    pdf.codigo('docker compose up -d')
    
    pdf.subtitulo('4.5 Verificar Status')
    pdf.codigo('docker compose ps')
    
    pdf.paragrafo('Todos os serviços devem estar com status "running":')
    pdf.codigo('ophion-server     running   0.0.0.0:8080->8080/tcp\nophion-web        running   0.0.0.0:3000->3000/tcp\nophion-postgres   running   5432/tcp\nophion-clickhouse running   9000/tcp\nophion-redis      running   6379/tcp')
    
    pdf.sucesso('Acesse o dashboard em http://localhost:3000')
    
    # ========== 5. CONFIGURAÇÃO ==========
    pdf.add_page()
    pdf.titulo('5. Configuração')
    
    pdf.subtitulo('5.1 Arquivo .env')
    pdf.paragrafo('Todas as configurações são feitas via variáveis de ambiente no arquivo .env:')
    
    pdf.subtitulo2('Organização')
    pdf.codigo('ORG_NAME="Minha Empresa"\nADMIN_EMAIL=admin@empresa.com\nADMIN_PASSWORD=senha-segura')
    
    pdf.subtitulo2('Rede')
    pdf.codigo('DOMAIN=localhost\nSERVER_PORT=8080\nDASHBOARD_PORT=3000')
    
    pdf.subtitulo2('Segurança')
    pdf.codigo('JWT_SECRET=<64-caracteres-aleatorios>\nAPI_KEY=ophion_<64-caracteres-hex>')
    
    pdf.alerta('Nunca compartilhe o JWT_SECRET ou API_KEY!')
    
    pdf.add_page()
    pdf.subtitulo2('Banco de Dados')
    pdf.codigo('POSTGRES_USER=ophion\nPOSTGRES_PASSWORD=senha-segura\nDATABASE_URL=postgres://ophion:senha@postgres:5432/ophion')
    
    pdf.subtitulo2('Alertas - Telegram')
    pdf.codigo('TELEGRAM_ENABLED=true\nTELEGRAM_BOT_TOKEN=123456:ABC...\nTELEGRAM_CHAT_ID=-100123456789')
    
    pdf.subtitulo2('IA (OpenAI)')
    pdf.codigo('OPENAI_API_KEY=sk-...')
    
    pdf.subtitulo('5.2 Gerar Credenciais Seguras')
    pdf.codigo('# JWT Secret\nopenssl rand -hex 32\n\n# API Key\necho "ophion_$(openssl rand -hex 32)"')
    
    # ========== 6. AGENT ==========
    pdf.add_page()
    pdf.titulo('6. Instalação do Agent')
    
    pdf.paragrafo('O Agent é instalado em cada servidor que você deseja monitorar.')
    
    pdf.subtitulo('6.1 Instalação Automática')
    pdf.codigo('curl -fsSL http://SEU-SERVIDOR:8080/install-agent.sh | sudo bash')
    
    pdf.subtitulo('6.2 Instalação Manual')
    
    pdf.subtitulo2('Baixar o binário')
    pdf.codigo('curl -o /usr/local/bin/ophion-agent \\\n  http://SEU-SERVIDOR:8080/downloads/agent/linux/amd64/ophion-agent\nchmod +x /usr/local/bin/ophion-agent')
    
    pdf.subtitulo2('Criar configuração')
    pdf.codigo('mkdir -p /etc/ophion\ncat > /etc/ophion/agent.yaml << EOF\nserver:\n  url: http://SEU-SERVIDOR:8080\n  api_key: SUA-API-KEY\n\ncollection:\n  interval: 30s\n\nmetrics:\n  enabled: true\n  include:\n    - cpu\n    - memory\n    - disk\n    - network\n\nlogs:\n  enabled: true\n  paths:\n    - /var/log/syslog\n    - /var/log/auth.log\nEOF')
    
    pdf.add_page()
    pdf.subtitulo2('Criar serviço systemd')
    pdf.codigo('cat > /etc/systemd/system/ophion-agent.service << EOF\n[Unit]\nDescription=OPHION Monitoring Agent\nAfter=network.target\n\n[Service]\nType=simple\nExecStart=/usr/local/bin/ophion-agent -config /etc/ophion/agent.yaml\nRestart=always\nRestartSec=10\n\n[Install]\nWantedBy=multi-user.target\nEOF')
    
    pdf.subtitulo2('Iniciar o serviço')
    pdf.codigo('sudo systemctl daemon-reload\nsudo systemctl enable ophion-agent\nsudo systemctl start ophion-agent')
    
    pdf.subtitulo2('Verificar status')
    pdf.codigo('sudo systemctl status ophion-agent\nsudo journalctl -u ophion-agent -f')
    
    # ========== 7. PRIMEIROS PASSOS ==========
    pdf.add_page()
    pdf.titulo('7. Primeiros Passos')
    
    pdf.subtitulo('7.1 Acessar o Dashboard')
    pdf.item('Abra o navegador em http://localhost:3000')
    pdf.item('Faça login com o email e senha do administrador')
    
    pdf.subtitulo('7.2 Adicionar Hosts')
    pdf.item('Instale o Agent em cada servidor')
    pdf.item('Os hosts aparecerão automaticamente no dashboard')
    
    pdf.subtitulo('7.3 Configurar Alertas')
    pdf.item('Acesse Settings > Alerts')
    pdf.item('Crie regras de alerta (ex: CPU > 90%)')
    pdf.item('Configure canais de notificação (Telegram, Slack, Email)')
    
    pdf.subtitulo('7.4 Usar o Copilot')
    pdf.item('Clique no ícone do chat no canto inferior')
    pdf.item('Faça perguntas sobre sua infraestrutura')
    pdf.item('Exemplo: "Por que o servidor X está lento?"')
    
    pdf.subtitulo('7.5 Configurar Auto-Healing')
    pdf.item('Acesse Settings > Auto-Healing')
    pdf.item('Comece no modo dry-run (apenas sugestões)')
    pdf.item('Revise e aprove ações antes de habilitar automação total')
    
    # ========== 8. CLI ==========
    pdf.add_page()
    pdf.titulo('8. Comandos CLI')
    
    pdf.paragrafo('O OPHION inclui uma CLI para gerenciamento:')
    
    pdf.codigo('ophion start         # Iniciar todos os serviços\nophion stop          # Parar todos os serviços\nophion restart       # Reiniciar serviços\nophion status        # Ver status dos containers\nophion logs          # Ver logs do servidor\nophion logs ophion-web  # Ver logs do dashboard\nophion update        # Atualizar para última versão\nophion backup        # Criar backup dos dados\nophion api-key       # Gerar nova API Key\nophion agent-install # Ver comando de instalação do agent')
    
    pdf.subtitulo('Exemplos')
    
    pdf.subtitulo2('Ver logs em tempo real')
    pdf.codigo('ophion logs -f')
    
    pdf.subtitulo2('Criar backup')
    pdf.codigo('ophion backup\n# Backup criado em /opt/ophion/backups/20260206_120000/')
    
    pdf.subtitulo2('Atualizar')
    pdf.codigo('ophion update\n# Baixa novas imagens e reinicia os serviços')
    
    # ========== 9. SEGURANÇA ==========
    pdf.add_page()
    pdf.titulo('9. Segurança')
    
    pdf.subtitulo('9.1 Autenticação')
    pdf.item('JWT Tokens para usuários (acesso ao dashboard)')
    pdf.item('API Keys para agents e integrações')
    pdf.item('Bcrypt para hash de senhas (cost 12)')
    
    pdf.subtitulo('9.2 Rate Limiting')
    pdf.codigo('Login:     5 requisições/minuto\nAPI:       100 requisições/minuto\nIngestão:  1000 requisições/minuto')
    
    pdf.subtitulo('9.3 Proteção contra Brute Force')
    pdf.item('5 tentativas de login = bloqueio de 15 minutos')
    pdf.item('Tracking por IP + email')
    
    pdf.subtitulo('9.4 Política de Senha')
    pdf.item('Mínimo 12 caracteres')
    pdf.item('Letra maiúscula obrigatória')
    pdf.item('Letra minúscula obrigatória')
    pdf.item('Número obrigatório')
    pdf.item('Caractere especial obrigatório')
    
    pdf.subtitulo('9.5 HTTPS')
    pdf.paragrafo('Em produção, sempre use HTTPS. Recomendamos Cloudflare ou Let\'s Encrypt.')
    
    # ========== 10. TROUBLESHOOTING ==========
    pdf.add_page()
    pdf.titulo('10. Troubleshooting')
    
    pdf.subtitulo('Containers não iniciam')
    pdf.codigo('# Ver logs de erro\ndocker compose logs\n\n# Verificar recursos\ndocker system df\ndf -h')
    
    pdf.subtitulo('Agent não conecta')
    pdf.codigo('# Testar conectividade\ncurl http://SEU-SERVIDOR:8080/health\n\n# Ver logs do agent\njournalctl -u ophion-agent -f')
    
    pdf.subtitulo('Erro de SSL (Cloudflare)')
    pdf.item('Verifique se o modo SSL está em "Flexible" ou "Full"')
    pdf.item('Se "Full (Strict)", precisa de certificado válido no servidor')
    
    pdf.subtitulo('Resetar senha do admin')
    pdf.codigo("docker compose exec postgres psql -U ophion -c \\\n  \"UPDATE users SET password_hash = \\\n   crypt('nova-senha', gen_salt('bf')) \\\n   WHERE email = 'admin@email.com';\"")
    
    pdf.subtitulo('Limpar dados e recomeçar')
    pdf.codigo('ophion stop\nrm -rf /opt/ophion/data/*\nophion start')
    pdf.alerta('Isso apaga todos os dados! Use apenas em último caso.')
    
    # ========== 11. SUPORTE ==========
    pdf.add_page()
    pdf.titulo('11. Suporte')
    
    pdf.subtitulo('Documentação')
    pdf.item('Site: https://docs.ophion.com.br')
    pdf.item('GitHub: https://github.com/bigtux/ophion')
    
    pdf.subtitulo('Comunidade')
    pdf.item('Discord: https://discord.gg/ophion')
    pdf.item('Email: suporte@ophion.com.br')
    
    pdf.subtitulo('Reportar Bugs')
    pdf.item('GitHub Issues: https://github.com/bigtux/ophion/issues')
    
    pdf.subtitulo('Segurança')
    pdf.item('Vulnerabilidades: security@ophion.com.br')
    pdf.alerta('NAO abra issues publicas para vulnerabilidades de segurança!')
    
    pdf.ln(10)
    pdf.set_font('DejaVu', '', 10)
    pdf.set_text_color(128, 128, 128)
    pdf.cell(0, 10, '(c) 2026 OPHION - Made with love in Brazil', new_x='LMARGIN', new_y='NEXT', align='C')
    
    # Salvar
    output_path = '/home/kernelpanic/projetos_jarvis/ophion/docs/OPHION_Manual_Instalacao.pdf'
    pdf.output(output_path)
    print(f'PDF gerado: {output_path}')
    return output_path

if __name__ == '__main__':
    gerar_manual()
