<?php
namespace Gestoreasy\Core\Fiscal\Nfse\Providers;

use Gestoreasy\Core\Fiscal\Nfse\NfseProviderInterface;
use Gestoreasy\Core\Fiscal\TaxConfig;

class RJProvider implements NfseProviderInterface
{
    public function emit(\PDO $pdo, array $order, array $company, array $client): array
    {
        $valorTotal = (float)($order['valor_total'] ?? $order['valor_total_cents'] / 100.0 ?? 0.0);
        $config = TaxConfig::get($pdo);
        $opts = is_array($config['options'] ?? null) ? $config['options'] : [];
        $rjOpts = $opts['nfse']['uf_rates']['RJ'] ?? ['iss' => 5.0]; // default 5%
        $issRate = (float)($rjOpts['iss'] ?? 5.0);
        $issValor = round($valorTotal * ($issRate / 100.0), 2);

        // Inscrição municipal do prestador
        $imPrestador = (string)($company['im'] ?? $company['inscricao_municipal'] ?? '');

        // Código de município (Rio de Janeiro: 3304557) se cidade = 'Rio de Janeiro'
        $municipioCodigo = null;
        $cidade = strtoupper(trim((string)($company['cidade'] ?? '')));
        if ($cidade === 'RIO DE JANEIRO') {
            $municipioCodigo = '3304557';
        }

        $numero = $this->generateSequentialNumber($pdo);
        $verification = strtoupper(substr(hash('sha256', $numero . '-RJ-' . ($company['cnpj'] ?? '000')), 0, 8));

        return [
            'provider' => [
                'name' => 'RJProvider',
                'uf' => 'RJ',
                'rules' => [
                    'iss_rate_percent' => $issRate,
                    'municipio_codigo' => $municipioCodigo,
                ],
            ],
            'nfse' => [
                'numero' => $numero,
                'codigo_verificacao' => $verification,
                'data_emissao' => date('c'),
                'valor_servico' => $valorTotal,
                'valor_iss' => $issValor,
                'prestador_inscricao_municipal' => $imPrestador,
                'municipio_codigo' => $municipioCodigo,
                'status' => 'autorizada',
            ],
        ];
    }

    private function generateSequentialNumber(\PDO $pdo): string
    {
        $base = 'RJ' . date('Ymd');
        try {
            $r = $pdo->query('SELECT COUNT(*) AS c FROM service_documents WHERE tipo = "nfse"')->fetch();
            $seq = (int)($r['c'] ?? 0) + 1;
            return $base . str_pad((string)$seq, 5, '0', STR_PAD_LEFT);
        } catch (\Throwable $e) {
            return $base . '00001';
        }
    }
}