/**
 * DocuAgro - Serviço de Geração de Dossiê PDF
 * Compila todos os documentos validados do produtor em um PDF profissional
 */

const PDFDocument = require('pdfkit');
const fs = require('fs');
const path = require('path');
const dayjs = require('dayjs');
const db = require('./database');
const { TIPOS_DOCUMENTO } = require('./system-prompt');

// Cores do tema
const CORES = {
  verde: '#2D7D46',
  verdeClaro: '#E8F5E9',
  amarelo: '#FFA000',
  vermelho: '#D32F2F',
  cinza: '#616161',
  cinzaClaro: '#F5F5F5',
  branco: '#FFFFFF',
  preto: '#212121'
};

/**
 * Gera o dossiê PDF de um produtor
 * @param {string} produtorId - ID do produtor
 * @returns {string} - Caminho do PDF gerado
 */
async function gerarDossie(produtorId) {
  const produtor = db.buscarProdutorPorId(produtorId);
  if (!produtor) throw new Error('Produtor não encontrado');
  
  const documentos = db.buscarDocumentos(produtorId);
  const uploadDir = process.env.UPLOAD_DIR || path.join(__dirname, '..', '..', 'uploads');
  const dossiePath = path.join(uploadDir, 'dossies');
  
  // Cria diretório de dossiês
  if (!fs.existsSync(dossiePath)) fs.mkdirSync(dossiePath, { recursive: true });
  
  const nomeArquivo = `dossie_${produtor.cpf_cnpj || produtor.id}_${dayjs().format('YYYYMMDD_HHmmss')}.pdf`;
  const caminhoCompleto = path.join(dossiePath, nomeArquivo);
  
  return new Promise((resolve, reject) => {
    const doc = new PDFDocument({
      size: 'A4',
      margins: { top: 60, bottom: 60, left: 50, right: 50 },
      info: {
        Title: `Dossiê EUDR - ${produtor.nome}`,
        Author: 'DocuAgro',
        Subject: 'Dossiê de Compliance EUDR',
        Creator: 'DocuAgro v1.0'
      }
    });
    
    const stream = fs.createWriteStream(caminhoCompleto);
    doc.pipe(stream);
    
    // === CAPA ===
    gerarCapa(doc, produtor);
    
    // === PÁGINA DE DADOS DO PRODUTOR ===
    doc.addPage();
    gerarDadosProdutor(doc, produtor);
    
    // === PÁGINAS DE DOCUMENTOS ===
    doc.addPage();
    gerarResumoDocumentos(doc, documentos);
    
    // === DETALHES DE CADA DOCUMENTO ===
    for (const documento of documentos) {
      doc.addPage();
      gerarDetalheDocumento(doc, documento, uploadDir);
    }
    
    // === PÁGINA FINAL - DECLARAÇÃO ===
    doc.addPage();
    gerarDeclaracao(doc, produtor, documentos);
    
    // Rodapé em todas as páginas
    const totalPaginas = doc.bufferedPageRange().count;
    for (let i = 0; i < totalPaginas; i++) {
      doc.switchToPage(i);
      gerarRodape(doc, i + 1, totalPaginas);
    }
    
    doc.end();
    
    stream.on('finish', () => {
      // Salva no banco
      const docsIncluidos = documentos.map(d => d.tipo);
      db.salvarDossie(produtorId, caminhoCompleto, docsIncluidos);
      
      console.log(`📄 Dossiê gerado: ${nomeArquivo}`);
      resolve(caminhoCompleto);
    });
    
    stream.on('error', reject);
  });
}

/**
 * Gera a capa do dossiê
 */
function gerarCapa(doc, produtor) {
  // Fundo verde no topo
  doc.rect(0, 0, doc.page.width, 200).fill(CORES.verde);
  
  // Título
  doc.fontSize(32).fillColor(CORES.branco)
    .text('DocuAgro', 50, 60, { align: 'center' });
  doc.fontSize(14).fillColor(CORES.branco)
    .text('Dossiê de Compliance EUDR', 50, 105, { align: 'center' });
  doc.fontSize(10).fillColor(CORES.branco)
    .text('Regulamento (UE) 2023/1115', 50, 130, { align: 'center' });
  
  // Dados do produtor na capa
  doc.fontSize(18).fillColor(CORES.preto)
    .text(produtor.nome || 'Produtor', 50, 250, { align: 'center' });
  
  doc.fontSize(12).fillColor(CORES.cinza);
  if (produtor.cpf_cnpj) {
    doc.text(`CPF/CNPJ: ${produtor.cpf_cnpj}`, 50, 285, { align: 'center' });
  }
  if (produtor.propriedade_nome) {
    doc.text(`Propriedade: ${produtor.propriedade_nome}`, 50, 310, { align: 'center' });
  }
  if (produtor.propriedade_municipio) {
    doc.text(`${produtor.propriedade_municipio}/${produtor.propriedade_estado}`, 50, 335, { align: 'center' });
  }
  if (produtor.propriedade_area_ha) {
    doc.text(`Área: ${produtor.propriedade_area_ha} hectares`, 50, 360, { align: 'center' });
  }
  
  // Data de geração
  doc.fontSize(10).fillColor(CORES.cinza)
    .text(`Gerado em: ${dayjs().format('DD/MM/YYYY [às] HH:mm')}`, 50, 450, { align: 'center' });
  
  // Status
  const statusTexto = produtor.status === 'completo' ? '✅ COMPLIANCE COMPLETO' : '⚠️ COMPLIANCE EM ANDAMENTO';
  const statusCor = produtor.status === 'completo' ? CORES.verde : CORES.amarelo;
  
  doc.fontSize(16).fillColor(statusCor)
    .text(statusTexto, 50, 500, { align: 'center' });
}

/**
 * Gera página com dados do produtor
 */
function gerarDadosProdutor(doc, produtor) {
  doc.fontSize(18).fillColor(CORES.verde)
    .text('Dados do Produtor', 50, 60);
  
  doc.moveTo(50, 85).lineTo(545, 85).stroke(CORES.verde);
  
  const campos = [
    ['Nome Completo', produtor.nome || 'Não informado'],
    ['CPF/CNPJ', produtor.cpf_cnpj || 'Não informado'],
    ['Telefone', produtor.telefone || 'Não informado'],
    ['Propriedade', produtor.propriedade_nome || 'Não informada'],
    ['Município', produtor.propriedade_municipio || 'Não informado'],
    ['Estado', produtor.propriedade_estado || 'Não informado'],
    ['Área (hectares)', produtor.propriedade_area_ha ? `${produtor.propriedade_area_ha} ha` : 'Não informada'],
    ['Cultura Principal', produtor.cultura_principal || 'Não informada'],
    ['Documentos Aprovados', `${produtor.docs_completos} de ${produtor.docs_total}`],
    ['Status Compliance', produtor.status || 'Pendente'],
    ['Data de Cadastro', dayjs(produtor.criado_em).format('DD/MM/YYYY')]
  ];
  
  let y = 100;
  for (const [label, valor] of campos) {
    // Fundo alternado
    if (campos.indexOf([label, valor]) % 2 === 0) {
      doc.rect(50, y - 5, 495, 25).fill(CORES.cinzaClaro);
    }
    
    doc.fontSize(10).fillColor(CORES.cinza).text(label, 60, y);
    doc.fontSize(10).fillColor(CORES.preto).text(valor, 250, y);
    y += 28;
  }
}

/**
 * Gera resumo dos documentos
 */
function gerarResumoDocumentos(doc, documentos) {
  doc.fontSize(18).fillColor(CORES.verde)
    .text('Resumo dos Documentos', 50, 60);
  
  doc.moveTo(50, 85).lineTo(545, 85).stroke(CORES.verde);
  
  let y = 100;
  
  // Cabeçalho da tabela
  doc.fontSize(9).fillColor(CORES.branco);
  doc.rect(50, y - 5, 495, 22).fill(CORES.verde);
  doc.text('Documento', 60, y);
  doc.text('Status', 320, y);
  doc.text('Data Envio', 420, y);
  y += 28;
  
  // Lista todos os tipos de documento
  const todosOsTipos = [
    'car', 'ccir', 'itr', 'georreferenciamento',
    'licenca_ambiental', 'contrato_arrendamento',
    'nota_fiscal', 'declaracao_desmatamento'
  ];
  
  for (const tipo of todosOsTipos) {
    const docEncontrado = documentos.find(d => d.tipo === tipo);
    const info = TIPOS_DOCUMENTO[tipo];
    
    // Fundo alternado
    if (todosOsTipos.indexOf(tipo) % 2 === 0) {
      doc.rect(50, y - 5, 495, 22).fill(CORES.cinzaClaro);
    }
    
    doc.fontSize(9).fillColor(CORES.preto);
    doc.text(info?.nome || tipo, 60, y, { width: 250 });
    
    if (docEncontrado) {
      const statusCor = {
        'aprovado': CORES.verde,
        'enviado': CORES.amarelo,
        'validando': CORES.amarelo,
        'rejeitado': CORES.vermelho,
        'pendente': CORES.cinza,
        'vencido': CORES.vermelho
      }[docEncontrado.status] || CORES.cinza;
      
      doc.fillColor(statusCor).text(docEncontrado.status.toUpperCase(), 320, y);
      doc.fillColor(CORES.cinza).text(
        docEncontrado.enviado_em ? dayjs(docEncontrado.enviado_em).format('DD/MM/YYYY') : '-',
        420, y
      );
    } else {
      doc.fillColor(CORES.cinza).text('NÃO ENVIADO', 320, y);
      doc.text('-', 420, y);
    }
    
    y += 25;
  }
}

/**
 * Gera página de detalhe de um documento
 */
function gerarDetalheDocumento(doc, documento, uploadDir) {
  const info = TIPOS_DOCUMENTO[documento.tipo];
  
  doc.fontSize(16).fillColor(CORES.verde)
    .text(info?.nome || documento.tipo, 50, 60);
  
  doc.moveTo(50, 85).lineTo(545, 85).stroke(CORES.verde);
  
  let y = 100;
  
  // Status com badge colorida
  const statusCor = {
    'aprovado': CORES.verde,
    'enviado': CORES.amarelo,
    'rejeitado': CORES.vermelho
  }[documento.status] || CORES.cinza;
  
  doc.fontSize(12).fillColor(statusCor)
    .text(`Status: ${documento.status.toUpperCase()}`, 50, y);
  y += 30;
  
  // Detalhes do arquivo
  doc.fontSize(10).fillColor(CORES.cinza);
  if (documento.arquivo_nome) {
    doc.text(`Arquivo: ${documento.arquivo_nome}`, 50, y); y += 20;
  }
  if (documento.enviado_em) {
    doc.text(`Enviado em: ${dayjs(documento.enviado_em).format('DD/MM/YYYY [às] HH:mm')}`, 50, y); y += 20;
  }
  if (documento.validado_em) {
    doc.text(`Validado em: ${dayjs(documento.validado_em).format('DD/MM/YYYY [às] HH:mm')}`, 50, y); y += 20;
  }
  
  // Dados extraídos
  if (documento.dados_extraidos) {
    y += 10;
    doc.fontSize(12).fillColor(CORES.preto).text('Dados Extraídos:', 50, y); y += 20;
    try {
      const dados = JSON.parse(documento.dados_extraidos);
      for (const [chave, valor] of Object.entries(dados)) {
        doc.fontSize(9).fillColor(CORES.cinza).text(`${chave}: ${valor}`, 70, y); y += 18;
      }
    } catch (e) {
      doc.fontSize(9).fillColor(CORES.cinza).text(documento.dados_extraidos, 70, y);
    }
  }
  
  // Resultado da validação
  if (documento.validacao_detalhes) {
    y += 10;
    doc.fontSize(12).fillColor(CORES.preto).text('Validação:', 50, y); y += 20;
    doc.fontSize(9).fillColor(CORES.cinza).text(documento.validacao_detalhes, 70, y, { width: 470 });
  }
  
  // Tenta incluir miniatura da imagem
  if (documento.arquivo_path && fs.existsSync(documento.arquivo_path)) {
    const ext = path.extname(documento.arquivo_path).toLowerCase();
    if (['.jpg', '.jpeg', '.png'].includes(ext)) {
      try {
        y += 30;
        if (y < 500) {
          doc.image(documento.arquivo_path, 50, y, { width: 300, height: 250, fit: [300, 250] });
        }
      } catch (e) {
        // Imagem não pôde ser incluída
      }
    }
  }
}

/**
 * Gera página de declaração final
 */
function gerarDeclaracao(doc, produtor, documentos) {
  doc.fontSize(18).fillColor(CORES.verde)
    .text('Declaração de Conformidade', 50, 60, { align: 'center' });
  
  doc.moveTo(50, 90).lineTo(545, 90).stroke(CORES.verde);
  
  const docsAprovados = documentos.filter(d => d.status === 'aprovado').length;
  const totalDocs = 8;
  
  doc.fontSize(11).fillColor(CORES.preto);
  
  const texto = `
Declaro, para os devidos fins e efeitos do Regulamento (UE) 2023/1115 (EUDR - European Union Deforestation Regulation), que o produtor rural abaixo identificado apresentou a documentação solicitada para fins de compliance ambiental e fundiário:

Produtor: ${produtor.nome || 'Não informado'}
CPF/CNPJ: ${produtor.cpf_cnpj || 'Não informado'}
Propriedade: ${produtor.propriedade_nome || 'Não informada'}
Município/UF: ${produtor.propriedade_municipio || '?'}/${produtor.propriedade_estado || '?'}
Área: ${produtor.propriedade_area_ha ? produtor.propriedade_area_ha + ' hectares' : 'Não informada'}
Cultura Principal: ${produtor.cultura_principal || 'Não informada'}

Documentos apresentados e validados: ${docsAprovados} de ${totalDocs}

${docsAprovados >= totalDocs 
  ? 'Todos os documentos obrigatórios foram apresentados e validados. O produtor encontra-se em conformidade com os requisitos documentais para exportação sob o regime EUDR.'
  : 'ATENÇÃO: Nem todos os documentos obrigatórios foram apresentados e/ou validados. O dossiê encontra-se INCOMPLETO para fins de compliance EUDR.'}

Este dossiê foi gerado automaticamente pelo sistema DocuAgro em ${dayjs().format('DD/MM/YYYY [às] HH:mm')}.

Os documentos originais encontram-se armazenados digitalmente e disponíveis para verificação.
`;
  
  doc.text(texto.trim(), 50, 110, { width: 495, lineGap: 4 });
  
  // Área de assinatura
  const y = 550;
  doc.moveTo(150, y).lineTo(450, y).stroke(CORES.cinza);
  doc.fontSize(10).fillColor(CORES.cinza)
    .text('Assinatura do Responsável / Cooperativa', 150, y + 5, { align: 'center', width: 300 });
  
  doc.moveTo(150, y + 60).lineTo(450, y + 60).stroke(CORES.cinza);
  doc.text(`${produtor.nome || 'Produtor'}`, 150, y + 65, { align: 'center', width: 300 });
}

/**
 * Rodapé padrão
 */
function gerarRodape(doc, pagina, total) {
  const y = doc.page.height - 40;
  doc.fontSize(8).fillColor(CORES.cinza);
  doc.text(`DocuAgro - Compliance EUDR | Página ${pagina} de ${total}`, 50, y, {
    align: 'center',
    width: doc.page.width - 100
  });
}

module.exports = {
  gerarDossie
};
