/**
 * DocuAgro - Bot Telegram
 * Núcleo do bot que interage com produtores rurais
 * Coleta documentos para compliance EUDR
 */

const { Telegraf, Markup } = require('telegraf');
const path = require('path');
const fs = require('fs');
const https = require('https');
const http = require('http');
const { v4: uuidv4 } = require('uuid');
const db = require('../services/database');
const ai = require('../services/ai-service');
const ocr = require('../services/ocr-service');
const { gerarDossie } = require('../services/pdf-service');
const { TIPOS_DOCUMENTO, ORDEM_COLETA } = require('../services/system-prompt');

const UPLOAD_DIR = process.env.UPLOAD_DIR || path.join(__dirname, '..', '..', 'uploads');

// Garante que diretório de uploads existe
if (!fs.existsSync(UPLOAD_DIR)) fs.mkdirSync(UPLOAD_DIR, { recursive: true });

/**
 * Inicializa e configura o bot Telegram
 */
function criarBot() {
  const bot = new Telegraf(process.env.TELEGRAM_BOT_TOKEN);
  
  // ============================================================
  // COMANDO /start - Início da conversa
  // ============================================================
  bot.start(async (ctx) => {
    try {
      const chatId = ctx.chat.id;
      const username = ctx.from.username;
      const nome = [ctx.from.first_name, ctx.from.last_name].filter(Boolean).join(' ');
      
      console.log(`🆕 Novo usuário: ${nome} (@${username}) - Chat: ${chatId}`);
      
      // Verifica se já tem cadastro
      let produtor = db.buscarProdutorPorChat(chatId);
      
      if (produtor) {
        // Já cadastrado - mostra status
        const docs = db.buscarDocumentos(produtor.id);
        const resposta = await ai.processarMensagem(produtor, 'Voltei! Como está minha documentação?', docs);
        await ctx.reply(resposta);
        return;
      }
      
      // Novo produtor - cria cadastro
      produtor = db.criarProdutor(chatId, username, nome);
      
      // Mensagem de boas-vindas
      const boasVindas = `🌱 *Bem-vindo ao DocuAgro!*

Oi, ${nome}! Eu sou o DocuAgro, seu assistente para organizar a documentação da sua propriedade rural.

📋 *Por que isso é importante?*
A União Europeia criou uma nova regra (EUDR) que exige comprovação de que a produção não vem de área desmatada. Sem essa documentação, pode ter problema na hora de vender.

🤝 *Como funciona?*
Vou te pedir alguns documentos, um de cada vez. Pode mandar foto ou PDF. Eu confiro e te aviso se tá tudo certo.

São 8 documentos no total. Vamos começar?

Primeiro, me conta: *qual é o seu nome completo?*`;
      
      await ctx.reply(boasVindas, { parse_mode: 'Markdown' });
      
    } catch (erro) {
      console.error('❌ Erro no /start:', erro);
      await ctx.reply('Ops, tive um probleminha. Tenta de novo com /start');
    }
  });
  
  // ============================================================
  // COMANDO /status - Status dos documentos
  // ============================================================
  bot.command('status', async (ctx) => {
    try {
      const produtor = db.buscarProdutorPorChat(ctx.chat.id);
      
      if (!produtor) {
        await ctx.reply('Você ainda não começou! Use /start pra iniciar.');
        return;
      }
      
      const docs = db.buscarDocumentos(produtor.id);
      let mensagem = `📊 *Status da sua documentação*\n\n`;
      mensagem += `👤 ${produtor.nome}\n`;
      mensagem += `🏡 ${produtor.propriedade_nome || 'Propriedade não informada'}\n\n`;
      
      // Lista cada documento
      for (const tipo of ORDEM_COLETA) {
        const doc = docs.find(d => d.tipo === tipo);
        const info = TIPOS_DOCUMENTO[tipo];
        let icone = '⬜';
        
        if (doc) {
          switch (doc.status) {
            case 'aprovado': icone = '✅'; break;
            case 'enviado':
            case 'validando': icone = '🟡'; break;
            case 'rejeitado': icone = '❌'; break;
            case 'vencido': icone = '⚠️'; break;
          }
        }
        
        mensagem += `${icone} ${info.nome}\n`;
      }
      
      mensagem += `\n📈 Progresso: ${produtor.docs_completos}/${produtor.docs_total}`;
      
      await ctx.reply(mensagem, { parse_mode: 'Markdown' });
      
    } catch (erro) {
      console.error('❌ Erro no /status:', erro);
      await ctx.reply('Erro ao buscar status. Tenta de novo.');
    }
  });
  
  // ============================================================
  // COMANDO /dossie - Gera dossiê PDF
  // ============================================================
  bot.command('dossie', async (ctx) => {
    try {
      const produtor = db.buscarProdutorPorChat(ctx.chat.id);
      
      if (!produtor) {
        await ctx.reply('Você ainda não começou! Use /start pra iniciar.');
        return;
      }
      
      const docs = db.buscarDocumentos(produtor.id);
      
      if (docs.length === 0) {
        await ctx.reply('Você ainda não enviou nenhum documento. Vamos começar? Manda o primeiro!');
        return;
      }
      
      await ctx.reply('📄 Gerando seu dossiê... Aguarda um pouquinho!');
      
      const pdfPath = await gerarDossie(produtor.id);
      
      await ctx.replyWithDocument(
        { source: pdfPath, filename: `Dossie_EUDR_${produtor.nome.replace(/\s+/g, '_')}.pdf` },
        { caption: '📋 Seu dossiê EUDR está pronto! Esse documento reúne toda a documentação que você enviou.' }
      );
      
    } catch (erro) {
      console.error('❌ Erro no /dossie:', erro);
      await ctx.reply('Erro ao gerar o dossiê. Tenta de novo daqui a pouco.');
    }
  });
  
  // ============================================================
  // COMANDO /ajuda - Menu de ajuda
  // ============================================================
  bot.command('ajuda', async (ctx) => {
    const mensagem = `📚 *Ajuda - DocuAgro*

🤖 *Comandos disponíveis:*
/start - Iniciar ou recomeçar
/status - Ver status dos documentos
/dossie - Gerar dossiê PDF
/pular - Pular documento atual (se não tiver)
/ajuda - Este menu

📄 *Documentos que preciso:*
1. CAR (Cadastro Ambiental Rural)
2. CCIR (Certificado do INCRA)
3. ITR (Imposto Territorial Rural)
4. Georreferenciamento (mapa da propriedade)
5. Licença Ambiental
6. Contrato de Arrendamento (se não for dono)
7. Nota Fiscal de Venda
8. Declaração de Não Desmatamento

📸 *Dicas para enviar documentos:*
• Tire foto em lugar com boa luz
• Enquadre o documento inteiro
• PDF é melhor que foto
• Mande um documento por vez

❓ *Dúvidas?* É só mandar mensagem que eu ajudo!`;
    
    await ctx.reply(mensagem, { parse_mode: 'Markdown' });
  });
  
  // ============================================================
  // COMANDO /pular - Pula documento atual
  // ============================================================
  bot.command('pular', async (ctx) => {
    try {
      const produtor = db.buscarProdutorPorChat(ctx.chat.id);
      if (!produtor) {
        await ctx.reply('Use /start primeiro!');
        return;
      }
      
      const tipoAtual = ai.determinarTipoDocumento(produtor);
      if (!tipoAtual) {
        await ctx.reply('Não tem documento pra pular agora.');
        return;
      }
      
      const novaEtapa = ai.avancarEtapa(produtor);
      const produtorAtualizado = db.buscarProdutorPorId(produtor.id);
      const docs = db.buscarDocumentos(produtor.id);
      
      const info = TIPOS_DOCUMENTO[tipoAtual];
      await ctx.reply(`⏭️ Pulei o ${info?.nome || tipoAtual}. Pode enviar depois!`);
      
      // Pede próximo documento
      const resposta = await ai.processarMensagem(
        produtorAtualizado,
        'Pulei o documento anterior, qual o próximo?',
        docs
      );
      await ctx.reply(resposta);
      
    } catch (erro) {
      console.error('❌ Erro no /pular:', erro);
      await ctx.reply('Erro ao pular. Tenta de novo.');
    }
  });
  
  // ============================================================
  // RECEBIMENTO DE FOTOS
  // ============================================================
  bot.on('photo', async (ctx) => {
    try {
      const produtor = db.buscarProdutorPorChat(ctx.chat.id);
      
      if (!produtor) {
        await ctx.reply('Opa! Primeiro use /start pra se cadastrar, depois me manda os documentos.');
        return;
      }
      
      // Pega a foto de melhor qualidade (última do array)
      const foto = ctx.message.photo[ctx.message.photo.length - 1];
      const fileId = foto.file_id;
      
      // Baixa o arquivo
      const file = await ctx.telegram.getFile(fileId);
      const filePath = file.file_path;
      const fileUrl = `https://api.telegram.org/file/bot${process.env.TELEGRAM_BOT_TOKEN}/${filePath}`;
      
      // Salva localmente
      const nomeArquivo = `${uuidv4()}${path.extname(filePath) || '.jpg'}`;
      const caminhoLocal = path.join(UPLOAD_DIR, produtor.id);
      if (!fs.existsSync(caminhoLocal)) fs.mkdirSync(caminhoLocal, { recursive: true });
      const caminhoCompleto = path.join(caminhoLocal, nomeArquivo);
      
      await baixarArquivo(fileUrl, caminhoCompleto);
      
      console.log(`📸 Foto recebida de ${produtor.nome}: ${nomeArquivo}`);
      
      // Determina tipo do documento baseado na etapa
      const tipoDoc = ai.determinarTipoDocumento(produtor);
      
      if (tipoDoc) {
        // Salva documento no banco
        db.salvarDocumento(produtor.id, tipoDoc, {
          status: 'enviado',
          arquivo_path: caminhoCompleto,
          arquivo_nome: nomeArquivo,
          arquivo_tipo: 'image/jpeg',
          arquivo_tamanho: foto.file_size || 0
        });
        
        // OCR em background
        processarOCR(produtor.id, tipoDoc, caminhoCompleto);
        
        // Resposta da IA
        const docs = db.buscarDocumentos(produtor.id);
        const resposta = await ai.processarDocumento(
          produtor, tipoDoc,
          `Foto do ${TIPOS_DOCUMENTO[tipoDoc]?.nome}. Legenda: ${ctx.message.caption || 'sem legenda'}`
        );
        
        await ctx.reply(resposta);
        
        // Avança para próximo documento
        const novaEtapa = ai.avancarEtapa(produtor);
        if (novaEtapa === 'completo') {
          await ctx.reply('🎉 *Parabéns!* Você enviou todos os documentos!\n\nUse /dossie pra gerar seu dossiê completo.', { parse_mode: 'Markdown' });
        }
        
      } else {
        // Não está em etapa de coleta
        const docs = db.buscarDocumentos(produtor.id);
        const resposta = await ai.processarMensagem(
          produtor,
          `Enviei uma foto. ${ctx.message.caption || ''}`,
          docs
        );
        await ctx.reply(resposta);
      }
      
    } catch (erro) {
      console.error('❌ Erro ao processar foto:', erro);
      await ctx.reply('Tive um problema pra receber a foto. Pode tentar de novo?');
    }
  });
  
  // ============================================================
  // RECEBIMENTO DE DOCUMENTOS (PDF, etc)
  // ============================================================
  bot.on('document', async (ctx) => {
    try {
      const produtor = db.buscarProdutorPorChat(ctx.chat.id);
      
      if (!produtor) {
        await ctx.reply('Primeiro use /start pra se cadastrar!');
        return;
      }
      
      const documento = ctx.message.document;
      const fileId = documento.file_id;
      const fileName = documento.file_name || 'documento';
      const mimeType = documento.mime_type || 'application/octet-stream';
      
      // Baixa o arquivo
      const file = await ctx.telegram.getFile(fileId);
      const fileUrl = `https://api.telegram.org/file/bot${process.env.TELEGRAM_BOT_TOKEN}/${file.file_path}`;
      
      // Salva localmente
      const ext = path.extname(fileName) || '.pdf';
      const nomeArquivo = `${uuidv4()}${ext}`;
      const caminhoLocal = path.join(UPLOAD_DIR, produtor.id);
      if (!fs.existsSync(caminhoLocal)) fs.mkdirSync(caminhoLocal, { recursive: true });
      const caminhoCompleto = path.join(caminhoLocal, nomeArquivo);
      
      await baixarArquivo(fileUrl, caminhoCompleto);
      
      console.log(`📁 Documento recebido de ${produtor.nome}: ${fileName} (${mimeType})`);
      
      // Determina tipo do documento
      const tipoDoc = ai.determinarTipoDocumento(produtor);
      
      if (tipoDoc) {
        db.salvarDocumento(produtor.id, tipoDoc, {
          status: 'enviado',
          arquivo_path: caminhoCompleto,
          arquivo_nome: fileName,
          arquivo_tipo: mimeType,
          arquivo_tamanho: documento.file_size || 0
        });
        
        // OCR se for imagem
        if (mimeType.startsWith('image/')) {
          processarOCR(produtor.id, tipoDoc, caminhoCompleto);
        }
        
        const resposta = await ai.processarDocumento(
          produtor, tipoDoc,
          `Arquivo: ${fileName} (${mimeType}). Legenda: ${ctx.message.caption || 'sem legenda'}`
        );
        
        await ctx.reply(resposta);
        
        // Avança etapa
        const novaEtapa = ai.avancarEtapa(produtor);
        if (novaEtapa === 'completo') {
          await ctx.reply('🎉 *Todos os documentos enviados!* Use /dossie pra gerar seu dossiê.', { parse_mode: 'Markdown' });
        }
      } else {
        const docs = db.buscarDocumentos(produtor.id);
        const resposta = await ai.processarMensagem(
          produtor,
          `Enviei um arquivo: ${fileName}. ${ctx.message.caption || ''}`,
          docs
        );
        await ctx.reply(resposta);
      }
      
    } catch (erro) {
      console.error('❌ Erro ao processar documento:', erro);
      await ctx.reply('Tive um problema pra receber o arquivo. Pode tentar de novo?');
    }
  });
  
  // ============================================================
  // MENSAGENS DE TEXTO
  // ============================================================
  bot.on('text', async (ctx) => {
    try {
      const produtor = db.buscarProdutorPorChat(ctx.chat.id);
      const mensagem = ctx.message.text;
      
      if (!produtor) {
        // Cria cadastro automaticamente
        const nome = [ctx.from.first_name, ctx.from.last_name].filter(Boolean).join(' ');
        const novoProdutor = db.criarProdutor(ctx.chat.id, ctx.from.username, nome);
        
        const resposta = await ai.processarMensagem(null, mensagem, []);
        await ctx.reply(resposta);
        return;
      }
      
      // Envia pra IA processar
      const docs = db.buscarDocumentos(produtor.id);
      const resposta = await ai.processarMensagem(produtor, mensagem, docs);
      
      await ctx.reply(resposta);
      
    } catch (erro) {
      console.error('❌ Erro ao processar mensagem:', erro);
      await ctx.reply('Desculpa, tive um problema. Pode repetir?');
    }
  });
  
  // ============================================================
  // ERRO GLOBAL
  // ============================================================
  bot.catch((erro, ctx) => {
    console.error('❌ Erro no bot:', erro);
  });
  
  return bot;
}

// ============================================================
// FUNÇÕES AUXILIARES
// ============================================================

/**
 * Baixa arquivo de uma URL para o disco
 */
function baixarArquivo(url, destino) {
  return new Promise((resolve, reject) => {
    const protocolo = url.startsWith('https') ? https : http;
    const file = fs.createWriteStream(destino);
    
    protocolo.get(url, (response) => {
      response.pipe(file);
      file.on('finish', () => {
        file.close(resolve);
      });
    }).on('error', (erro) => {
      fs.unlink(destino, () => {}); // Limpa arquivo parcial
      reject(erro);
    });
  });
}

/**
 * Processa OCR em background (não bloqueia a resposta)
 */
async function processarOCR(produtorId, tipoDoc, caminhoArquivo) {
  try {
    console.log(`🔍 Iniciando OCR para ${tipoDoc}...`);
    
    const resultado = await ocr.extrairTexto(caminhoArquivo);
    
    if (resultado.sucesso) {
      // Valida o documento
      const validacao = ocr.validarDocumento(tipoDoc, resultado.texto);
      
      const doc = db.buscarDocumento(produtorId, tipoDoc);
      if (doc) {
        const novoStatus = validacao.valido ? 'aprovado' : 'enviado';
        db.atualizarValidacao(
          doc.id,
          novoStatus,
          validacao.detalhes.join('; ')
        );
        
        // Atualiza dados extraídos
        if (Object.keys(validacao.dados_extraidos).length > 0) {
          db.db.prepare('UPDATE documentos SET dados_extraidos = ? WHERE id = ?')
            .run(JSON.stringify(validacao.dados_extraidos), doc.id);
        }
        
        console.log(`✅ OCR ${tipoDoc}: ${novoStatus} - ${validacao.detalhes.join(', ')}`);
      }
    } else {
      console.log(`⚠️ OCR falhou para ${tipoDoc}: confiança baixa`);
    }
  } catch (erro) {
    console.error(`❌ Erro no OCR (${tipoDoc}):`, erro.message);
  }
}

module.exports = { criarBot };
