'use client';

import { useEffect, useState, useRef } from 'react';
import { useParams, useSearchParams } from 'next/navigation';
import api from '@/lib/api';
import { KlavoNFSe, NFSeData, MunicipioInfo } from '@/components/KlavoNFSe';

const TAX_REGIME_LABELS: Record<number, string> = {
  1: 'Simples Nacional',
  2: 'Simples Nacional — excesso de sublimite',
  3: 'Regime Normal',
  4: 'Lucro Real',
  5: 'Lucro Presumido',
  6: 'MEI',
};

async function ibgeMunicipio(code?: string): Promise<{ municipio: string; uf: string }> {
  if (!code) return { municipio: '—', uf: '—' };
  try {
    const r = await fetch(
      `https://servicodados.ibge.gov.br/api/v1/localidades/municipios/${code}`,
    );
    if (!r.ok) throw new Error();
    const d = await r.json();
    return {
      municipio: d.nome ?? code,
      uf: d.microrregiao?.mesorregiao?.UF?.sigla ?? '—',
    };
  } catch {
    return { municipio: code, uf: '—' };
  }
}

function mapStatus(s: string): NFSeData['status'] {
  if (s === 'issued')    return 'autorizada';
  if (s === 'cancelled') return 'cancelada';
  if (s === 'error')     return 'rejeitada';
  return 'processando';
}

export default function PrintNfsePage() {
  const params = useParams();
  const searchParams = useSearchParams();
  const id = params?.id as string;
  const autoPrint = searchParams?.get('autoprint') === '1';
  const printed = useRef(false);

  const [nfseData,  setNfseData]  = useState<NFSeData | null>(null);
  const [municipio, setMunicipio] = useState<MunicipioInfo | null>(null);
  const [error,     setError]     = useState<string | null>(null);

  useEffect(() => {
    if (!id) return;

    Promise.all([
      api.get(`/invoices/${id}`),
      api.get('/tenant'),
    ])
      .then(async ([invRes, tenantRes]) => {
        const inv    = invRes.data;
        const tenant = tenantRes.data;
        const client = (await api.get(`/clients/${inv.clientId}`)).data;

        const [tenantMuni, clientMuni, serviceMuni] = await Promise.all([
          ibgeMunicipio(tenant.ibgeCode),
          ibgeMunicipio(client.ibgeCode),
          ibgeMunicipio(inv.serviceCityCode),
        ]);

        const issAmount = Number(inv.issAmount ?? 0);
        const aliquota  = Number(inv.issAliquota ?? 0);

        const data: NFSeData = {
          numero:     inv.nfseNumber ?? String(inv.rpsNumber ?? '—'),
          dpsNumero:  String(inv.rpsNumber ?? '—'),
          dpsSerie:   inv.rpsSerie ?? 'RPS',
          emissaoEm:  inv.nfseIssuedAt ?? inv.createdAt ?? new Date().toISOString(),
          chaveAcesso: inv.nfseVerifyCode ?? inv.nfseNumber ?? String(inv.rpsNumber ?? '—'),
          autorizacao: inv.nfseNumber ?? String(inv.rpsNumber ?? '—'),
          status:      mapStatus(inv.status),

          municipioEmissor: {
            municipio: tenantMuni.municipio,
            uf: tenant.uf ?? tenantMuni.uf,
          },
          naturezaOperacao: 'Tributação no município',
          regimeTributario: TAX_REGIME_LABELS[tenant.taxRegime ?? 1] ?? 'Regime Normal',

          prestador: {
            nome: tenant.name,
            cnpj: tenant.document?.replace(/\D/g, '').length !== 11 ? tenant.document : undefined,
            cpf:  tenant.document?.replace(/\D/g, '').length === 11 ? tenant.document : undefined,
            inscricaoMunicipal: tenant.municipalInscription ?? undefined,
            endereco: {
              logradouro: '—',
              municipio:  tenantMuni.municipio,
              uf:         tenant.uf ?? tenantMuni.uf,
              cep:        '—',
            },
            telefone: tenant.phone   ?? undefined,
            email:    tenant.email   ?? undefined,
            simplesNacional: tenant.simpleNational,
            logoUrl:  tenant.logoUrl ?? undefined,
          },

          tomador: {
            nome: client.name,
            cnpj: client.document?.replace(/\D/g, '').length !== 11 ? client.document : undefined,
            cpf:  client.document?.replace(/\D/g, '').length === 11 ? client.document : undefined,
            inscricaoMunicipal: client.municipalInscription ?? undefined,
            endereco: {
              logradouro: [client.address, client.addressNumber].filter(Boolean).join(', ') || '—',
              bairro:     client.neighborhood ?? undefined,
              municipio:  clientMuni.municipio,
              uf:         client.uf ?? clientMuni.uf,
              cep:        client.zipCode ?? '—',
            },
            telefone: client.phone  ?? undefined,
            email:    client.email  ?? undefined,
          },

          servico: {
            codigoLc116:      inv.serviceListItem ?? '—',
            codigoMunicipal:  inv.cnaeCode ?? undefined,
            itemListaServico: inv.serviceListItem ?? '—',
            descricao:        inv.discrimination ?? '—',
            municipioPrestacao: { municipio: serviceMuni.municipio, uf: serviceMuni.uf, pais: 'Brasil' },
            municipioIssqn:     { municipio: serviceMuni.municipio, uf: serviceMuni.uf },
            paisResultado: 'Brasil',
          },

          tributacao: {
            situacaoIssqn:          'Operação tributável',
            baseCalculo:            Number(inv.serviceAmount),
            aliquota,
            issqnApurado:           issAmount,
            retencaoIssqn:          inv.issRetained ? 'retido' : 'nao_retido',
            deducoes:               0,
            descontoIncondicionado: 0,
            irrf:           0,
            inss:           0,
            contribSociais: 0,
          },

          totais: {
            valorServico:      Number(inv.serviceAmount),
            issqnRetido:       inv.issRetained ? issAmount : undefined,
            retencoesFederais: 0,
            valorLiquido:      Number(inv.netAmount ?? inv.serviceAmount),
            tributosAproxFederais:  0,
            tributosAproxEstaduais: 0,
            tributosAproxMunicipais: issAmount,
          },

          urlVerificacao: inv.nfseUrl ?? undefined,
        };

        let portalHost = '—';
        if (tenant.nfseUrl) {
          try { portalHost = new URL(tenant.nfseUrl).hostname; } catch { portalHost = tenant.nfseUrl; }
        }

        const muni: MunicipioInfo = {
          nome:       tenantMuni.municipio,
          uf:         tenant.uf ?? tenantMuni.uf,
          secretaria: 'Secretaria Municipal de Fazenda',
          telefone:   '—',
          portal:     portalHost,
        };

        setNfseData(data);
        setMunicipio(muni);
      })
      .catch((e) => {
        setError(e?.response?.data?.message ?? e?.message ?? 'Erro ao carregar nota');
      });
  }, [id]);

  // Dispara impressão automática quando os dados estão prontos
  useEffect(() => {
    if (!autoPrint || !nfseData || !municipio || printed.current) return;
    printed.current = true;
    const t = setTimeout(() => window.print(), 600);
    return () => clearTimeout(t);
  }, [autoPrint, nfseData, municipio]);

  if (error) {
    return (
      <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', minHeight: '100vh', fontFamily: 'sans-serif', color: '#374151' }}>
        <div style={{ textAlign: 'center' }}>
          <p style={{ fontWeight: 600, marginBottom: 8 }}>Erro ao carregar NFS-e</p>
          <p style={{ fontSize: 14, color: '#6B7280' }}>{error}</p>
        </div>
      </div>
    );
  }

  if (!nfseData || !municipio) {
    return (
      <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', minHeight: '100vh', fontFamily: 'sans-serif', color: '#9CA3AF', fontSize: 14 }}>
        Carregando...
      </div>
    );
  }

  return (
    <div style={{ background: '#E9E6DC', padding: '48px 0 96px', minHeight: '100vh' }}>
      <KlavoNFSe data={nfseData} municipio={municipio} showControls={!autoPrint} />
    </div>
  );
}
