/* Gera folhas A4 de exemplo a partir de recibos realmente selados. */
import pg from 'pg';
import { writeFileSync, mkdirSync } from 'node:fs';
import { comContexto } from '../../src/db/client.ts';
import { CadastrosService } from '../../src/domain/cadastros.service.ts';
import { LicencaService } from '../../src/domain/licenca.service.ts';
import { RecibosService } from '../../src/domain/recibos.service.ts';
import { ImpressaoService } from '../../src/domain/impressao.service.ts';
import type { UsuarioRef } from '../../src/core/identity.ts';

const TENANT = '11111111-1111-1111-1111-111111111111';
const SERIE_R = 'a0000000-0000-0000-0000-00000000005a';
const SERIE_P = 'a0000000-0000-0000-0000-00000000005b';

const supervisor: UsuarioRef = {
  id: 'a0000000-0000-0000-0000-000000000a01', nome: 'Vitória Campos',
  email: 'vitoria@dc.com.br', papel: 'SUPERVISOR', seriesPermitidas: [SERIE_R, SERIE_P],
};

const pool = new pg.Pool({
  host: process.env.PGHOST ?? '/tmp', port: Number(process.env.PGPORT ?? 5599),
  user: 'recibos_app', database: process.env.PGDATABASE ?? 'recibos_amostra',
});
const admin = new pg.Pool({
  host: process.env.PGHOST ?? '/tmp', port: Number(process.env.PGPORT ?? 5599),
  user: 'postgres', database: process.env.PGDATABASE ?? 'recibos_amostra',
});

await admin.query(
  `INSERT INTO recibos.license_state (tenant_id, plano, status, modo, limites, valido_ate, grace_dias)
   VALUES ($1,'profissional','ATIVA','saas','{"recibos_mes":500}'::jsonb, now() + interval '60 days', 15)
   ON CONFLICT (tenant_id) DO NOTHING`, [TENANT]);

const cadastros = new CadastrosService(pool as any);
const licenca = new LicencaService(pool as any);
const recibos = new RecibosService(pool as any, licenca);
const impressao = new ImpressaoService(pool as any, 'https://ravapi.com/v');

mkdirSync('amostras', { recursive: true });

await comContexto({ tenantId: TENANT }, async () => {
  const escola = await cadastros.criarContraparte(supervisor, {
    tipoPessoa: 'PJ', nomeRazaoSocial: 'Escola Semear Ltda',
    cpfCnpj: '11.222.333/0001-81', cidade: 'Ipatinga', uf: 'MG',
  });
  const ricardo = await cadastros.criarContraparte(supervisor, {
    tipoPessoa: 'PF', nomeRazaoSocial: 'Ricardo Alves Teixeira',
    cpfCnpj: '529.982.247-25', cidade: 'Ipatinga', uf: 'MG',
  });

  const entrada = await recibos.selar(supervisor, {
    seriesId: SERIE_R, counterpartyId: escola.id, valorCentavos: 432000,
    descricao: 'almoço de formatura para 60 pessoas, realizado em 04/09/2026, conforme orçamento nº 2026-0418',
    formaPagamento: 'Transferência', dataPagamento: '2026-09-11',
    localPagamento: 'Ipatinga/MG', referencia: 'Contrato 2026-0418',
  });
  writeFileSync('amostras/1-recebimento.html',
    await impressao.html(supervisor, entrada.recibo.id));

  const saida = await recibos.selar(supervisor, {
    seriesId: SERIE_P, counterpartyId: ricardo.id, valorCentavos: 22000,
    descricao: 'diária de cozinha no evento do dia 09/09/2026, das 14h às 23h, conforme escala assinada',
    formaPagamento: 'PIX', dataPagamento: '2026-09-11', localPagamento: 'Ipatinga/MG',
  });
  writeFileSync('amostras/2-pagamento.html',
    await impressao.html(supervisor, saida.recibo.id));

  const cancelado = await recibos.selar(supervisor, {
    seriesId: SERIE_R, counterpartyId: escola.id, valorCentavos: 55500,
    descricao: 'sinal de 30% do evento de 05/09/2026',
    formaPagamento: 'PIX', dataPagamento: '2026-09-11', localPagamento: 'Ipatinga/MG',
  });
  await recibos.cancelar(supervisor, cancelado.recibo.id, 'evento remarcado a pedido do cliente');
  writeFileSync('amostras/3-cancelado.html',
    await impressao.html(supervisor, cancelado.recibo.id));

  console.log('amostras geradas:',
    entrada.recibo.numero_formatado, saida.recibo.numero_formatado, cancelado.recibo.numero_formatado);
});

await pool.end(); await admin.end();
