import * as kv from './kv_store.tsx';

/**
 * 🌱 SCRIPT DE SEED - DADOS REALISTAS PARA TESTE DO SAFT
 * 
 * Este script popula o banco com dados de teste realistas para validar
 * a exportação SAFT antes da homologação com a Autoridade Tributária.
 * 
 * ATENÇÃO: Este script é apenas para TESTE. Não usar em produção com dados reais.
 */

// ========== DADOS DE TESTE ==========

const CLIENTES_TESTE = [
  {
    id: 'CLI001',
    codigo: 'CLI001',
    nome: 'Empresa Moçambicana de Comércio, Lda',
    nuit: '400123456',
    email: 'comercio@exemplo.co.mz',
    telefone: '+258 84 123 4567',
    endereco: 'Av. Julius Nyerere, 1234',
    cidade: 'Maputo',
    tipo: 'cliente',
  },
  {
    id: 'CLI002',
    codigo: 'CLI002',
    nome: 'Supermercado Central SARL',
    nuit: '400987654',
    email: 'central@exemplo.co.mz',
    telefone: '+258 84 987 6543',
    endereco: 'Rua da Resistência, 567',
    cidade: 'Maputo',
    tipo: 'cliente',
  },
  {
    id: 'CLI003',
    codigo: 'CLI003',
    nome: 'Restaurante Sabor Africano',
    nuit: '400555123',
    email: 'sabor@exemplo.co.mz',
    telefone: '+258 84 555 1234',
    endereco: 'Av. Marginal, 890',
    cidade: 'Maputo',
    tipo: 'cliente',
  },
  {
    id: 'CLI004',
    codigo: 'CLI004',
    nome: 'Hotel Oceano Índico',
    nuit: '400777888',
    email: 'hotel@exemplo.co.mz',
    telefone: '+258 84 777 8888',
    endereco: 'Av. Friedrich Engels, 2345',
    cidade: 'Maputo',
    tipo: 'cliente',
  },
  {
    id: 'CLI005',
    codigo: 'CLI005',
    nome: 'Farmácia São Lucas',
    nuit: '400222333',
    email: 'farmacia@exemplo.co.mz',
    telefone: '+258 84 222 3333',
    endereco: 'Rua Pereira do Lago, 456',
    cidade: 'Maputo',
    tipo: 'cliente',
  },
];

const ARTIGOS_TESTE = [
  {
    id: 'ART001',
    codigo: 'PROD001',
    descricao: 'Computador Portátil HP',
    precoVenda: 45000.00,
    imposto: 16,
    categoria: 'Tecnologia',
  },
  {
    id: 'ART002',
    codigo: 'PROD002',
    descricao: 'Mouse Wireless Logitech',
    precoVenda: 850.00,
    imposto: 16,
    categoria: 'Tecnologia',
  },
  {
    id: 'ART003',
    codigo: 'SERV001',
    descricao: 'Consultoria em TI (hora)',
    precoVenda: 1500.00,
    imposto: 16,
    categoria: 'Serviços',
  },
  {
    id: 'ART004',
    codigo: 'PROD003',
    descricao: 'Arroz Tipo 1 (25kg)',
    precoVenda: 1200.00,
    imposto: 0,
    categoria: 'Alimentos',
  },
  {
    id: 'ART005',
    codigo: 'PROD004',
    descricao: 'Água Mineral (Pack 6un)',
    precoVenda: 180.00,
    imposto: 0,
    categoria: 'Bebidas',
  },
];

// ========== FUNÇÕES DE GERAÇÃO ==========

function gerarFactura(empresaId: string, index: number, dataEmissao: string, cliente: any): any {
  const id = `factura-seed-${Date.now()}-${index}`;
  
  // Selecionar 1-3 artigos aleatórios
  const numArtigos = Math.floor(Math.random() * 3) + 1;
  const artigosSelecionados = ARTIGOS_TESTE.slice(0, numArtigos);
  
  const itens = artigosSelecionados.map((artigo, i) => {
    const quantidade = Math.floor(Math.random() * 5) + 1;
    const precoUnitario = artigo.precoVenda;
    const subtotalItem = quantidade * precoUnitario;
    const impostoItem = (subtotalItem * artigo.imposto) / 100;
    const totalItem = subtotalItem + impostoItem;
    
    return {
      id: `item-${i}`,
      artigoId: artigo.id,
      codigo: artigo.codigo,
      descricao: artigo.descricao,
      quantidade,
      precoUnitario,
      imposto: artigo.imposto,
      desconto: 0,
      total: totalItem,
    };
  });
  
  const subtotal = itens.reduce((acc, item) => acc + (item.quantidade * item.precoUnitario), 0);
  const totalImpostos = itens.reduce((acc, item) => acc + ((item.quantidade * item.precoUnitario * item.imposto) / 100), 0);
  const totalGeral = subtotal + totalImpostos;
  
  const ano = new Date(dataEmissao).getFullYear();
  const numeroFormatado = String(index + 1).padStart(4, '0');
  
  // Data de vencimento: 30 dias após emissão
  const dataVencimento = new Date(dataEmissao);
  dataVencimento.setDate(dataVencimento.getDate() + 30);
  
  return {
    id,
    empresaId,
    numeroDocumento: `Factura nº ${numeroFormatado}/${ano}`,
    dataEmissao,
    dataVencimento: dataVencimento.toISOString().split('T')[0],
    estado: Math.random() > 0.3 ? 'paga' : 'pendente',
    clienteId: cliente.id,
    cliente: {
      codigo: cliente.codigo,
      nome: cliente.nome,
      nuit: cliente.nuit,
    },
    moeda: 'MT',
    condicaoPagamento: '30 dias',
    itens,
    subtotal,
    totalImpostos,
    descontos: 0,
    totalGeral,
    valorRecebido: Math.random() > 0.3 ? totalGeral : 0,
    observacoes: 'Documento gerado para teste SAFT',
    dataCriacao: new Date().toISOString(),
  };
}

function gerarCotacao(empresaId: string, index: number, dataEmissao: string, cliente: any): any {
  const id = `cotacao-seed-${Date.now()}-${index}`;
  
  const numArtigos = Math.floor(Math.random() * 3) + 1;
  const artigosSelecionados = ARTIGOS_TESTE.slice(0, numArtigos);
  
  const itens = artigosSelecionados.map((artigo, i) => {
    const quantidade = Math.floor(Math.random() * 10) + 1;
    const precoUnitario = artigo.precoVenda;
    const subtotalItem = quantidade * precoUnitario;
    const impostoItem = (subtotalItem * artigo.imposto) / 100;
    const totalItem = subtotalItem + impostoItem;
    
    return {
      id: `item-${i}`,
      artigoId: artigo.id,
      codigo: artigo.codigo,
      descricao: artigo.descricao,
      quantidade,
      precoUnitario,
      imposto: artigo.imposto,
      desconto: 0,
      total: totalItem,
    };
  });
  
  const subtotal = itens.reduce((acc, item) => acc + (item.quantidade * item.precoUnitario), 0);
  const totalImpostos = itens.reduce((acc, item) => acc + ((item.quantidade * item.precoUnitario * item.imposto) / 100), 0);
  const totalGeral = subtotal + totalImpostos;
  
  const ano = new Date(dataEmissao).getFullYear();
  const numeroFormatado = String(index + 1).padStart(4, '0');
  
  const dataValidade = new Date(dataEmissao);
  dataValidade.setDate(dataValidade.getDate() + 15);
  
  return {
    id,
    empresaId,
    numeroDocumento: `Cotação nº ${numeroFormatado}/${ano}`,
    dataEmissao,
    dataValidade: dataValidade.toISOString().split('T')[0],
    estado: Math.random() > 0.5 ? 'aprovada' : 'pendente',
    clienteId: cliente.id,
    cliente: {
      codigo: cliente.codigo,
      nome: cliente.nome,
      nuit: cliente.nuit,
    },
    moeda: 'MT',
    condicaoPagamento: '30 dias',
    itens,
    subtotal,
    totalImpostos,
    descontos: 0,
    totalGeral,
    observacoes: 'Cotação gerada para teste SAFT',
    dataCriacao: new Date().toISOString(),
  };
}

function gerarRecibo(empresaId: string, index: number, dataEmissao: string, cliente: any, facturaRef?: string): any {
  const id = `recibo-seed-${Date.now()}-${index}`;
  
  const valorPago = Math.floor(Math.random() * 50000) + 5000;
  
  const ano = new Date(dataEmissao).getFullYear();
  const numeroFormatado = String(index + 1).padStart(4, '0');
  
  return {
    id,
    empresaId,
    numeroDocumento: `Recibo ${numeroFormatado}/${ano}`,
    dataEmissao,
    estado: 'pago',
    clienteId: cliente.id,
    cliente: {
      codigo: cliente.codigo,
      nome: cliente.nome,
      nuit: cliente.nuit,
    },
    moeda: 'MT',
    valorRecebido: valorPago,
    totalGeral: valorPago,
    subtotal: valorPago,
    totalImpostos: 0,
    descontos: 0,
    facturaOrigem: facturaRef || '',
    metodoPagamento: Math.random() > 0.5 ? 'Transferência Bancária' : 'Dinheiro',
    observacoes: 'Recibo gerado para teste SAFT',
    dataCriacao: new Date().toISOString(),
  };
}

function gerarVendaDinheiro(empresaId: string, index: number, dataEmissao: string): any {
  const id = `venda-dinheiro-seed-${Date.now()}-${index}`;
  
  const numArtigos = Math.floor(Math.random() * 2) + 1;
  const artigosSelecionados = ARTIGOS_TESTE.slice(0, numArtigos);
  
  const itens = artigosSelecionados.map((artigo, i) => {
    const quantidade = Math.floor(Math.random() * 3) + 1;
    const precoUnitario = artigo.precoVenda;
    const subtotalItem = quantidade * precoUnitario;
    const impostoItem = (subtotalItem * artigo.imposto) / 100;
    const totalItem = subtotalItem + impostoItem;
    
    return {
      id: `item-${i}`,
      artigoId: artigo.id,
      codigo: artigo.codigo,
      descricao: artigo.descricao,
      quantidade,
      precoUnitario,
      imposto: artigo.imposto,
      desconto: 0,
      total: totalItem,
    };
  });
  
  const subtotal = itens.reduce((acc, item) => acc + (item.quantidade * item.precoUnitario), 0);
  const totalImpostos = itens.reduce((acc, item) => acc + ((item.quantidade * item.precoUnitario * item.imposto) / 100), 0);
  const totalGeral = subtotal + totalImpostos;
  
  const ano = new Date(dataEmissao).getFullYear();
  const numeroFormatado = String(index + 1).padStart(4, '0');
  
  return {
    id,
    empresaId,
    numeroDocumento: `VD ${numeroFormatado}/${ano}`,
    dataEmissao,
    estado: 'pago',
    cliente: {
      codigo: 'CONSUMIDOR',
      nome: 'Consumidor Final',
      nuit: '',
    },
    moeda: 'MT',
    itens,
    subtotal,
    totalImpostos,
    descontos: 0,
    totalGeral,
    valorRecebido: totalGeral,
    observacoes: 'Venda a dinheiro gerada para teste SAFT',
    dataCriacao: new Date().toISOString(),
  };
}

// ========== FUNÇÃO PRINCIPAL ==========

export async function seedSaftTestData(empresaId: string): Promise<void> {
  console.log('🌱 [SEED] Iniciando seed de dados para teste SAFT...');
  console.log(`📊 [SEED] Empresa: ${empresaId}`);
  
  try {
    // 1. Cadastrar clientes
    console.log('👥 [SEED] Cadastrando clientes de teste...');
    for (const cliente of CLIENTES_TESTE) {
      await kv.set(`cliente:${empresaId}:${cliente.id}`, cliente);
    }
    console.log(`✅ [SEED] ${CLIENTES_TESTE.length} clientes cadastrados`);
    
    // 2. Gerar documentos para Janeiro/2026
    console.log('📄 [SEED] Gerando documentos de Janeiro/2026...');
    
    let contadores = {
      facturas: 0,
      cotacoes: 0,
      recibos: 0,
      vendas: 0,
    };
    
    // Gerar 10 documentos variados ao longo do mês
    for (let dia = 5; dia <= 28; dia += 3) {
      const data = `2026-01-${String(dia).padStart(2, '0')}`;
      const clienteAleatorio = CLIENTES_TESTE[Math.floor(Math.random() * CLIENTES_TESTE.length)];
      
      // Factura
      const factura = gerarFactura(empresaId, contadores.facturas, data, clienteAleatorio);
      await kv.set(`factura:${empresaId}:${factura.id}`, factura);
      contadores.facturas++;
      
      // Cotação (50% de chance)
      if (Math.random() > 0.5) {
        const cotacao = gerarCotacao(empresaId, contadores.cotacoes, data, clienteAleatorio);
        await kv.set(`cotacao:${empresaId}:${cotacao.id}`, cotacao);
        contadores.cotacoes++;
      }
      
      // Recibo (referenciando a factura)
      const recibo = gerarRecibo(empresaId, contadores.recibos, data, clienteAleatorio, factura.numeroDocumento);
      await kv.set(`recibo:${empresaId}:${recibo.id}`, recibo);
      contadores.recibos++;
      
      // Venda a Dinheiro (30% de chance)
      if (Math.random() > 0.7) {
        const vd = gerarVendaDinheiro(empresaId, contadores.vendas, data);
        await kv.set(`venda-dinheiro:${empresaId}:${vd.id}`, vd);
        contadores.vendas++;
      }
    }
    
    console.log('✅ [SEED] Documentos de Janeiro/2026 gerados:');
    console.log(`   📝 Facturas: ${contadores.facturas}`);
    console.log(`   📋 Cotações: ${contadores.cotacoes}`);
    console.log(`   🧾 Recibos: ${contadores.recibos}`);
    console.log(`   💵 Vendas Dinheiro: ${contadores.vendas}`);
    
    // 3. Gerar alguns documentos para Fevereiro/2026
    console.log('📄 [SEED] Gerando documentos de Fevereiro/2026...');
    
    let contadoresFev = {
      facturas: contadores.facturas,
      cotacoes: contadores.cotacoes,
      recibos: contadores.recibos,
      vendas: contadores.vendas,
    };
    
    for (let dia = 3; dia <= 14; dia += 3) {
      const data = `2026-02-${String(dia).padStart(2, '0')}`;
      const clienteAleatorio = CLIENTES_TESTE[Math.floor(Math.random() * CLIENTES_TESTE.length)];
      
      const factura = gerarFactura(empresaId, contadoresFev.facturas, data, clienteAleatorio);
      await kv.set(`factura:${empresaId}:${factura.id}`, factura);
      contadoresFev.facturas++;
      
      if (Math.random() > 0.6) {
        const vd = gerarVendaDinheiro(empresaId, contadoresFev.vendas, data);
        await kv.set(`venda-dinheiro:${empresaId}:${vd.id}`, vd);
        contadoresFev.vendas++;
      }
    }
    
    console.log('✅ [SEED] Documentos de Fevereiro/2026 gerados:');
    console.log(`   📝 Facturas: ${contadoresFev.facturas - contadores.facturas}`);
    console.log(`   💵 Vendas Dinheiro: ${contadoresFev.vendas - contadores.vendas}`);
    
    console.log('');
    console.log('🎉 [SEED] Seed de dados concluído com sucesso!');
    console.log('');
    console.log('📊 TOTAIS:');
    console.log(`   👥 Clientes: ${CLIENTES_TESTE.length}`);
    console.log(`   📝 Facturas: ${contadoresFev.facturas}`);
    console.log(`   📋 Cotações: ${contadoresFev.cotacoes}`);
    console.log(`   🧾 Recibos: ${contadoresFev.recibos}`);
    console.log(`   💵 Vendas Dinheiro: ${contadoresFev.vendas}`);
    console.log(`   📄 TOTAL DOCUMENTOS: ${contadoresFev.facturas + contadoresFev.cotacoes + contadoresFev.recibos + contadoresFev.vendas}`);
    console.log('');
    console.log('✅ Agora você pode testar a exportação SAFT:');
    console.log('   • Exportar Janeiro/2026 (período completo)');
    console.log('   • Exportar Fevereiro/2026 parcial');
    console.log('   • Validar formato do arquivo');
    console.log('   • Conferir dados dos clientes');
    
  } catch (error: any) {
    console.error('❌ [SEED] Erro ao gerar dados:', error);
    throw error;
  }
}

// ========== FUNÇÃO DE LIMPEZA ==========

export async function cleanSaftTestData(empresaId: string): Promise<void> {
  console.log('🗑️  [SEED] Limpando dados de teste...');
  
  try {
    // Remover clientes de teste
    for (const cliente of CLIENTES_TESTE) {
      await kv.del(`cliente:${empresaId}:${cliente.id}`);
    }
    
    // Remover documentos seed
    const prefixos = ['factura', 'cotacao', 'recibo', 'venda-dinheiro', 'adiantamento', 'nota'];
    
    for (const prefixo of prefixos) {
      const docs = await kv.getByPrefix(`${prefixo}:${empresaId}:`);
      for (const doc of docs) {
        if (doc.id && doc.id.includes('seed')) {
          await kv.del(`${prefixo}:${empresaId}:${doc.id}`);
        }
      }
    }
    
    console.log('✅ [SEED] Dados de teste removidos com sucesso!');
  } catch (error: any) {
    console.error('❌ [SEED] Erro ao limpar dados:', error);
    throw error;
  }
}