/**
 * DocuAgro - Serviço de OCR
 * Extrai texto de imagens e PDFs usando Tesseract.js
 */

const Tesseract = require('tesseract.js');
const path = require('path');

/**
 * Extrai texto de uma imagem
 * @param {string} imagePath - Caminho da imagem
 * @returns {object} - Texto extraído e confiança
 */
async function extrairTexto(imagePath) {
  try {
    console.log(`🔍 OCR processando: ${path.basename(imagePath)}`);
    
    const resultado = await Tesseract.recognize(imagePath, 'por', {
      logger: info => {
        if (info.status === 'recognizing text') {
          // Log de progresso
        }
      }
    });
    
    const texto = resultado.data.text.trim();
    const confianca = resultado.data.confidence;
    
    console.log(`✅ OCR concluído: ${texto.length} caracteres, confiança: ${confianca}%`);
    
    return {
      texto,
      confianca,
      palavras: resultado.data.words?.length || 0,
      sucesso: texto.length > 10 && confianca > 30
    };
  } catch (erro) {
    console.error('❌ Erro no OCR:', erro.message);
    return {
      texto: '',
      confianca: 0,
      palavras: 0,
      sucesso: false,
      erro: erro.message
    };
  }
}

/**
 * Valida um documento baseado no texto extraído por OCR
 * @param {string} tipoDoc - Tipo do documento
 * @param {string} texto - Texto extraído
 * @returns {object} - Resultado da validação
 */
function validarDocumento(tipoDoc, texto) {
  const textoUpper = texto.toUpperCase();
  const resultado = {
    valido: false,
    detalhes: [],
    dados_extraidos: {}
  };
  
  switch (tipoDoc) {
    case 'car':
      // Procura número do CAR (formato: XX-XXXXXXX-XXXXXXXXXXXXXXXXXXXXXXXX)
      const carMatch = texto.match(/[A-Z]{2}[-.]?\d{7}[-.]?\w{20,}/i);
      if (carMatch) {
        resultado.dados_extraidos.numero_car = carMatch[0];
        resultado.detalhes.push(`Número CAR encontrado: ${carMatch[0]}`);
        resultado.valido = true;
      }
      // Verifica menções ao SICAR
      if (textoUpper.includes('SICAR') || textoUpper.includes('CADASTRO AMBIENTAL')) {
        resultado.detalhes.push('Documento parece ser um CAR');
        resultado.valido = true;
      }
      break;
      
    case 'ccir':
      // Procura menção ao INCRA
      if (textoUpper.includes('INCRA') || textoUpper.includes('CERTIFICADO') && textoUpper.includes('IMÓVEL RURAL')) {
        resultado.detalhes.push('Documento parece ser um CCIR');
        resultado.valido = true;
      }
      // Procura código do imóvel
      const ccirMatch = texto.match(/\d{3}\.\d{3}\.\d{3}\.\d{3}[-.]?\d/);
      if (ccirMatch) {
        resultado.dados_extraidos.codigo_imovel = ccirMatch[0];
        resultado.detalhes.push(`Código do imóvel: ${ccirMatch[0]}`);
      }
      break;
      
    case 'itr':
      // Procura menção a ITR / Receita Federal
      if (textoUpper.includes('ITR') || textoUpper.includes('IMPOSTO TERRITORIAL') || textoUpper.includes('RECEITA FEDERAL')) {
        resultado.detalhes.push('Documento parece ser comprovante de ITR');
        resultado.valido = true;
      }
      break;
      
    case 'georreferenciamento':
      // Procura coordenadas geográficas
      const coordMatch = texto.match(/-?\d{1,3}[.,]\d{2,}/g);
      if (coordMatch && coordMatch.length >= 2) {
        resultado.dados_extraidos.coordenadas = coordMatch.slice(0, 4);
        resultado.detalhes.push(`Coordenadas encontradas: ${coordMatch.length} pontos`);
        resultado.valido = true;
      }
      if (textoUpper.includes('MEMORIAL') || textoUpper.includes('TOPOGR') || textoUpper.includes('GEORREFERENCIA')) {
        resultado.valido = true;
        resultado.detalhes.push('Documento parece ser georreferenciamento');
      }
      break;
      
    case 'licenca_ambiental':
      if (textoUpper.includes('LICENÇA') || textoUpper.includes('LICENCA') || textoUpper.includes('AMBIENTAL')) {
        resultado.detalhes.push('Documento parece ser licença ambiental');
        resultado.valido = true;
      }
      // Procura validade
      const dataMatch = texto.match(/\d{2}\/\d{2}\/\d{4}/g);
      if (dataMatch) {
        resultado.dados_extraidos.datas_encontradas = dataMatch;
        resultado.detalhes.push(`Datas encontradas: ${dataMatch.join(', ')}`);
      }
      break;
      
    case 'contrato_arrendamento':
      if (textoUpper.includes('CONTRATO') || textoUpper.includes('ARRENDAMENTO') || textoUpper.includes('PARCERIA')) {
        resultado.detalhes.push('Documento parece ser contrato');
        resultado.valido = true;
      }
      break;
      
    case 'nota_fiscal':
      if (textoUpper.includes('NOTA FISCAL') || textoUpper.includes('NF-E') || textoUpper.includes('NFE') || textoUpper.includes('DANFE')) {
        resultado.detalhes.push('Documento parece ser nota fiscal');
        resultado.valido = true;
      }
      // Procura CPF/CNPJ
      const cpfMatch = texto.match(/\d{3}\.\d{3}\.\d{3}[-.]?\d{2}/);
      const cnpjMatch = texto.match(/\d{2}\.\d{3}\.\d{3}\/\d{4}[-.]?\d{2}/);
      if (cpfMatch) resultado.dados_extraidos.cpf = cpfMatch[0];
      if (cnpjMatch) resultado.dados_extraidos.cnpj = cnpjMatch[0];
      break;
      
    case 'declaracao_desmatamento':
      // Sempre válido - nós geramos esse documento
      resultado.valido = true;
      resultado.detalhes.push('Declaração de não desmatamento recebida');
      break;
      
    default:
      resultado.detalhes.push('Tipo de documento não reconhecido para validação automática');
  }
  
  // Se não conseguiu validar por tipo, verifica qualidade geral
  if (!resultado.valido && texto.length > 50) {
    resultado.valido = true;
    resultado.detalhes.push('Documento recebido - validação manual pode ser necessária');
  }
  
  return resultado;
}

/**
 * Extrai CPF ou CNPJ de um texto
 */
function extrairCpfCnpj(texto) {
  const cpf = texto.match(/\d{3}\.?\d{3}\.?\d{3}[-.]?\d{2}/);
  const cnpj = texto.match(/\d{2}\.?\d{3}\.?\d{3}\/?\d{4}[-.]?\d{2}/);
  return {
    cpf: cpf ? cpf[0] : null,
    cnpj: cnpj ? cnpj[0] : null
  };
}

module.exports = {
  extrairTexto,
  validarDocumento,
  extrairCpfCnpj
};
