<?php
header('Content-Type: application/json');
ini_set('display_errors', 0);
error_reporting(E_ALL);

require_once __DIR__ . '/../includes/funcoes.php';

$pdo = conectarBanco();
if (!$pdo) {
    http_response_code(500);
    echo json_encode(['sucesso' => false, 'erro' => 'Erro na conexão com o banco']);
    exit;
}

// Receber dados
$input = file_get_contents('php://input');
$dados = json_decode($input, true);

if (!$dados) {
    http_response_code(400);
    echo json_encode(['sucesso' => false, 'erro' => 'Dados não recebidos']);
    exit;
}

// Validar dados obrigatórios
if (empty($dados['empresa_id'])) {
    http_response_code(400);
    echo json_encode(['sucesso' => false, 'erro' => 'Empresa não informada']);
    exit;
}
if (empty($dados['emitente']['id'])) {
    http_response_code(400);
    echo json_encode(['sucesso' => false, 'erro' => 'Emitente não informado']);
    exit;
}
if (empty($dados['tomador']['id'])) {
    http_response_code(400);
    echo json_encode(['sucesso' => false, 'erro' => 'Tomador não informado']);
    exit;
}
if (empty($dados['nota']['ref'])) {
    http_response_code(400);
    echo json_encode(['sucesso' => false, 'erro' => 'Referência não informada']);
    exit;
}
if (empty($dados['nota']['codigo_servico'])) {
    http_response_code(400);
    echo json_encode(['sucesso' => false, 'erro' => 'Código do serviço não informado']);
    exit;
}
if (empty($dados['nota']['valor_servico']) || $dados['nota']['valor_servico'] <= 0) {
    http_response_code(400);
    echo json_encode(['sucesso' => false, 'erro' => 'Valor do serviço inválido']);
    exit;
}

// Buscar empresa
$stmt = $pdo->prepare("SELECT id, nome, token, ambiente, tipo_nfse, optante_simples, ativo FROM empresas WHERE id = ? AND ativo = 1");
$stmt->execute([$dados['empresa_id']]);
$empresa = $stmt->fetch(PDO::FETCH_ASSOC);

if (!$empresa) {
    http_response_code(404);
    echo json_encode(['sucesso' => false, 'erro' => 'Empresa não encontrada']);
    exit;
}

// Buscar emitente com todas as configurações
$stmt = $pdo->prepare("
    SELECT e.*, 
           end.logradouro, end.numero, end.complemento, end.bairro, 
           end.cidade, end.uf, end.cep, end.codigo_municipio
    FROM emitentes e 
    LEFT JOIN enderecos end ON e.endereco_id = end.id 
    WHERE e.id = ? AND e.ativo = 1
");
$stmt->execute([$dados['emitente']['id']]);
$emitente = $stmt->fetch(PDO::FETCH_ASSOC);

if (!$emitente) {
    http_response_code(404);
    echo json_encode(['sucesso' => false, 'erro' => 'Emitente não encontrado']);
    exit;
}

// Validar se o emitente pertence à empresa
if ($emitente['empresa_id'] != $empresa['id']) {
    http_response_code(400);
    echo json_encode([
        'sucesso' => false,
        'erro' => 'Emitente não pertence à empresa selecionada'
    ]);
    exit;
}

// CNPJ do prestador
$cnpjPrestador = preg_replace('/[^0-9]/', '', $emitente['cnpj']);
if (strlen($cnpjPrestador) != 14) {
    http_response_code(400);
    echo json_encode(['sucesso' => false, 'erro' => 'CNPJ do emitente inválido']);
    exit;
}

// Buscar tomador
$stmt = $pdo->prepare("
    SELECT t.*, end.logradouro, end.numero, end.complemento, end.bairro, 
           end.cidade, end.uf, end.cep, end.codigo_municipio
    FROM tomadores t 
    LEFT JOIN enderecos end ON t.endereco_id = end.id 
    WHERE t.id = ? AND t.ativo = 1
");
$stmt->execute([$dados['tomador']['id']]);
$tomador = $stmt->fetch(PDO::FETCH_ASSOC);

if (!$tomador) {
    http_response_code(400);
    echo json_encode(['sucesso' => false, 'erro' => 'Tomador não encontrado']);
    exit;
}

// Documento do tomador
$cnpjTomador = null;
$cpfTomador = null;
if (!empty($tomador['cnpj'])) {
    $cnpjTomador = preg_replace('/[^0-9]/', '', $tomador['cnpj']);
} elseif (!empty($tomador['cpf'])) {
    $cpfTomador = preg_replace('/[^0-9]/', '', $tomador['cpf']);
}

// ============================================================
// DADOS DA NOTA
// ============================================================
$ref = trim($dados['nota']['ref']);
$valorServico = (float)$dados['nota']['valor_servico'];
$descricao = trim($dados['nota']['descricao']);
if (!empty($dados['nota']['observacoes'])) {
    $descricao .= "\n\n" . trim($dados['nota']['observacoes']);
}
if (strlen($descricao) > 2000) {
    $descricao = substr($descricao, 0, 1997) . '...';
}

$dataEmissao = date('Y-m-d\TH:i:sP');
$dataCompetencia = date('Y-m-d');

// ============================================================
// CÓDIGO DO SERVIÇO
// ============================================================
$codigoServicoRaw = trim($dados['nota']['codigo_servico']);
$codigoServicoNumerico = preg_replace('/[^0-9]/', '', $codigoServicoRaw);

if (strlen($codigoServicoNumerico) == 4) {
    $codigoServico = $codigoServicoNumerico . '01';
} elseif (strlen($codigoServicoNumerico) == 6) {
    $codigoServico = $codigoServicoNumerico;
} elseif (strlen($codigoServicoNumerico) > 6) {
    $codigoServico = substr($codigoServicoNumerico, 0, 6);
} else {
    $codigoServico = str_pad($codigoServicoNumerico, 6, '0', STR_PAD_RIGHT);
}

$codigoServico = sprintf("%06d", (int)$codigoServico);

// ============================================================
// 🔥 CONFIGURAÇÕES VINDAS DO EMITENTE (BANCO DE DADOS)
// ============================================================

// Carregar TODAS as configurações do banco
$aliquotaISS = (float)($emitente['aliquota_iss'] ?? 2.00);
$codigoNBS = $emitente['codigo_nbs'] ?? '124032200';
$codigoMunicipio = (int)($emitente['codigo_municipio_prestacao'] ?? 4304606);
$tipoRetencaoIss = (int)($emitente['tipo_retencao_iss'] ?? 2);
$codigoOpcaoSimplesNacional = (int)($emitente['codigo_opcao_simples_nacional'] ?? 3);
$regimeTributarioSimplesNacional = $emitente['regime_tributario_simples_nacional'] ?? null;
$usarIbsCbs = (int)($emitente['usar_ibs_cbs'] ?? 1);
$usarTributacaoMunicipal = (int)($emitente['usar_tributacao_municipal'] ?? 1);
$usarInscricaoMunicipal = (int)($emitente['usar_inscricao_municipal'] ?? 1);
$inscricaoMunicipal = preg_replace('/[^0-9]/', '', $emitente['inscricao_municipal'] ?? '');

// ============================================================
// 🔥 SOBRESCREVER COM DADOS DO FRONTEND (se enviados)
// ============================================================
if (!empty($dados['nota']['aliquota']) && $dados['nota']['aliquota'] > 0) {
    $aliquotaISS = (float)$dados['nota']['aliquota'];
}
if (!empty($dados['nota']['codigo_nbs'])) {
    $codigoNBS = $dados['nota']['codigo_nbs'];
}
if (!empty($dados['nota']['municipio_prestacao'])) {
    $codigoMunicipio = (int)$dados['nota']['municipio_prestacao'];
}
if (!empty($dados['nota']['tipo_retencao_iss'])) {
    $tipoRetencaoIss = (int)$dados['nota']['tipo_retencao_iss'];
}
if (!empty($dados['nota']['codigo_opcao_simples_nacional'])) {
    $codigoOpcaoSimplesNacional = (int)$dados['nota']['codigo_opcao_simples_nacional'];
}

// ============================================================
// REGRAS ESPECÍFICAS POR EMPRESA (APENAS O NECESSÁRIO)
// ============================================================
$empresaId = (int)$empresa['id'];
$endpoint = '/nfsen';

// TIRENTULHO (ID 1) - Porto Alegre - Emissor Nacional
if ($empresaId == 1) {
    $codigoNBS = "121012200";
    $codigoMunicipio = 4314902;
    $tipoRetencaoIss = 1; // 🔥 Não retido - NÃO enviar alíquota
    $regimeTributarioSimplesNacional = 1;
    $usarTributacaoMunicipal = 0;
    $usarInscricaoMunicipal = 0;
    $usarIbsCbs = 0;
}

// TR (ID 2) - Canoas Regime Normal
if ($empresaId == 2) {
    $codigoNBS = "124032200";
    $codigoMunicipio = 4304606;
    $tipoRetencaoIss = 2;
    $regimeTributarioSimplesNacional = null;
    $usarTributacaoMunicipal = 1;
    $usarInscricaoMunicipal = 1;
    $usarIbsCbs = 1;
}

// RECILUX (ID 3) - Canoas Simples Nacional
if ($empresaId == 3) {
    $codigoNBS = "124033200";
    $codigoMunicipio = 4304606;
    $tipoRetencaoIss = 2;
    $regimeTributarioSimplesNacional = 1;
    $usarTributacaoMunicipal = 1;
    $usarInscricaoMunicipal = 1;
    $usarIbsCbs = 1;
}

// ============================================================
// CALCULAR ISS
// ============================================================
$valorISS = round(($valorServico * $aliquotaISS) / 100, 2);

// ============================================================
// VERIFICAR DUPLICIDADE
// ============================================================
$stmt = $pdo->prepare("SELECT id FROM notas_fiscais WHERE ref = ?");
$stmt->execute([$ref]);
if ($stmt->fetch()) {
    http_response_code(409);
    echo json_encode(['sucesso' => false, 'erro' => 'duplicada', 'mensagem' => 'Já existe uma nota com a referência "' . $ref . '"']);
    exit;
}

// ============================================================
// MONTAR PAYLOAD BASE
// ============================================================
$payload = [
    "data_emissao" => $dataEmissao,
    "data_competencia" => $dataCompetencia,
    "codigo_municipio_emissora" => $codigoMunicipio,
    "cnpj_prestador" => $cnpjPrestador,
    "codigo_opcao_simples_nacional" => $codigoOpcaoSimplesNacional,
    "regime_especial_tributacao" => 0,
    "cnpj_tomador" => $cnpjTomador,
    "razao_social_tomador" => substr($tomador['razao_social'], 0, 100),
    "codigo_municipio_tomador" => (int)($tomador['codigo_municipio'] ?? 4304606),
    "cep_tomador" => preg_replace('/[^0-9]/', '', $tomador['cep']),
    "logradouro_tomador" => substr($tomador['logradouro'], 0, 100),
    "numero_tomador" => substr($tomador['numero'] ?? 'S/N', 0, 10),
    "complemento_tomador" => substr($tomador['complemento'] ?? '', 0, 50),
    "bairro_tomador" => substr($tomador['bairro'] ?? 'CENTRO', 0, 50),
    "telefone_tomador" => preg_replace('/[^0-9]/', '', $tomador['telefone'] ?? ''),
    "email_tomador" => $tomador['email'] ?? '',
    "codigo_municipio_prestacao" => $codigoMunicipio,
    "codigo_tributacao_nacional_iss" => $codigoServico,
    "descricao_servico" => $descricao,
    "valor_servico" => $valorServico,
    "tributacao_iss" => 1,
    "tipo_retencao_iss" => (string)$tipoRetencaoIss,
    "codigo_nbs" => $codigoNBS
];

// ============================================================
// SÓ ADICIONAR inscricao_municipal_prestador SE PERMITIDO
// ============================================================
if ($usarInscricaoMunicipal && !empty($inscricaoMunicipal)) {
    $payload["inscricao_municipal_prestador"] = $inscricaoMunicipal;
}

// ============================================================
// SÓ ADICIONAR codigo_tributacao_municipal_iss SE PERMITIDO
// ============================================================
if ($usarTributacaoMunicipal) {
    $payload["codigo_tributacao_municipal_iss"] = "001";
}

// ============================================================
// 🔥 ADICIONAR PERCENTUAIS - APENAS SE HOUVER RETENÇÃO (tpRetISSQN = 2 ou 3)
// ============================================================
// Só envia alíquota se houver retenção
if ($tipoRetencaoIss == 2 || $tipoRetencaoIss == 3) {
    $payload["percentual_aliquota_relativa_municipio"] = number_format($aliquotaISS, 2, '.', '');
    $payload["percentual_total_tributos_municipais"] = number_format($aliquotaISS, 2, '.', '');
    if ($valorISS > 0) {
        $payload["valor_iss"] = $valorISS;
    }
}
// 🔥 Se tpRetISSQN = 1, NÃO enviar percentual_aliquota_relativa_municipio
// e NÃO enviar valor_iss

// Percentuais federais e estaduais (sempre enviar)
$payload["percentual_total_tributos_federais"] = "0.00";
$payload["percentual_total_tributos_estaduais"] = "0.00";
$payload["situacao_tributaria_pis_cofins"] = "00";
$payload["indicador_total_tributacao"] = null;

// ============================================================
// ADICIONAR regime_tributario_simples_nacional (se aplicável)
// ============================================================
if ($regimeTributarioSimplesNacional !== null) {
    $payload["regime_tributario_simples_nacional"] = $regimeTributarioSimplesNacional;
}

// ============================================================
// 🔥 IBS/CBS - APENAS PARA TR E RECILUX (NÃO PARA TIRENTULHO)
// ============================================================
if ($usarIbsCbs) {
    $payload["finalidade_emissao"] = $dados['nota']['finalidade_emissao'] ?? "0";
    $payload["consumidor_final"] = $dados['nota']['consumidor_final'] ?? "0";
    $payload["codigo_indicador_operacao"] = $dados['nota']['codigo_indicador_operacao'] ?? "050102";
    $payload["indicador_destinatario"] = $dados['nota']['indicador_destinatario'] ?? "0";
    $payload["ibs_cbs_situacao_tributaria"] = $dados['nota']['ibs_cbs_situacao_tributaria'] ?? "000";
    $payload["ibs_cbs_classificacao_tributaria"] = $dados['nota']['ibs_cbs_classificacao_tributaria'] ?? "000001";
    $payload["compra_governamental"] = $dados['nota']['compra_governamental'] ?? "0";
    $payload["pais_prestacao"] = $dados['nota']['pais_prestacao'] ?? "1058";
}

// Se for CPF em vez de CNPJ
if ($cpfTomador && !$cnpjTomador) {
    unset($payload['cnpj_tomador']);
    $payload['cpf_tomador'] = $cpfTomador;
}

// ============================================================
// SALVAR NOTA NO BANCO
// ============================================================
$stmt = $pdo->prepare("
    INSERT INTO notas_fiscais 
    (empresa_id, emitente_id, tomador_id, ref, codigo_servico, discriminacao_servico, 
     valor_servico, aliquota, valor_iss, iss_retido, status, payload_enviado, 
     data_emissao, data_competencia, criado_em)
    VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'processando_autorizacao', ?, ?, ?, NOW())
");

$issRetido = ($tipoRetencaoIss == 2 || $tipoRetencaoIss == 3) ? 1 : 0;

$stmt->execute([
    $empresa['id'], $emitente['id'], $tomador['id'], $ref, $codigoServico, $descricao,
    $valorServico, $aliquotaISS, $valorISS, $issRetido,
    json_encode($payload, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE),
    $dataEmissao, $dataCompetencia
]);

$nota_id = $pdo->lastInsertId();

// ============================================================
// ENVIAR PARA FOCUS NFe
// ============================================================
$baseUrl = $empresa['ambiente'] == 'producao' 
    ? 'https://api.focusnfe.com.br/v2' 
    : 'https://homologacao.focusnfe.com.br/v2';

$url = $baseUrl . $endpoint . '?ref=' . urlencode($ref);

// ============================================================
// LOG DE DEBUG
// ============================================================
error_log("=== ENVIO NFSe ===");
error_log("Empresa ID: " . $empresaId);
error_log("Empresa: " . $empresa['nome']);
error_log("Ambiente: " . $empresa['ambiente']);
error_log("Emitente ID: " . $emitente['id']);
error_log("CNPJ: " . $cnpjPrestador);
error_log("Alíquota: " . $aliquotaISS . "%");
error_log("NBS: " . $codigoNBS);
error_log("Município: " . $codigoMunicipio);
error_log("Regime: " . $codigoOpcaoSimplesNacional);
error_log("Retenção: " . $tipoRetencaoIss);
error_log("Regime SN: " . ($regimeTributarioSimplesNacional ?? 'null'));
error_log("Usa IBS/CBS: " . ($usarIbsCbs ? 'SIM' : 'NÃO'));
error_log("Envia Alíquota: " . (($tipoRetencaoIss == 2 || $tipoRetencaoIss == 3) ? 'SIM' : 'NÃO'));
error_log("Payload: " . json_encode($payload, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type: application/json',
    'Accept: application/json',
    'Authorization: Basic ' . base64_encode($empresa['token'] . ':')
]);
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

$resposta = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$curlError = curl_error($ch);
curl_close($ch);

$updateStmt = $pdo->prepare("UPDATE notas_fiscais SET resposta_api = ?, atualizado_em = NOW() WHERE id = ?");

if ($curlError) {
    $updateStmt->execute([json_encode(['erro_curl' => $curlError]), $nota_id]);
    http_response_code(500);
    echo json_encode(['sucesso' => false, 'erro' => 'Erro de conexão: ' . $curlError]);
    exit;
}

$respostaJson = json_decode($resposta, true);

// ============================================================
// SUCESSO
// ============================================================
if ($httpCode == 200 || $httpCode == 201 || $httpCode == 202) {
    $updateStmt->execute([$resposta, $nota_id]);
    
    $numeroNfse = $respostaJson['numero'] ?? $respostaJson['nfse']['numero'] ?? null;
    if ($numeroNfse) {
        $pdo->prepare("UPDATE notas_fiscais SET numero_nfse = ?, status = 'autorizada', data_autorizacao = NOW() WHERE id = ?")
            ->execute([$numeroNfse, $nota_id]);
    }
    
    echo json_encode([
        'sucesso' => true, 
        'numero_nfse' => $numeroNfse, 
        'ref' => $ref, 
        'dados' => $respostaJson
    ]);
    exit;
}

// ============================================================
// ERRO
// ============================================================
$updateStmt->execute([$resposta, $nota_id]);

$mensagemErro = '';
if (isset($respostaJson['erros']) && is_array($respostaJson['erros'])) {
    foreach ($respostaJson['erros'] as $erro) {
        $mensagemErro .= ($erro['Descricao'] ?? $erro['mensagem'] ?? '') . "\n";
    }
} elseif (isset($respostaJson['mensagem'])) {
    $mensagemErro = $respostaJson['mensagem'];
} elseif (isset($respostaJson['error'])) {
    $mensagemErro = $respostaJson['error'];
} else {
    $mensagemErro = 'Erro na comunicação com a Focus NFe (HTTP ' . $httpCode . ')';
}

$pdo->prepare("UPDATE notas_fiscais SET status = 'erro_validacao' WHERE id = ?")->execute([$nota_id]);

http_response_code($httpCode);
echo json_encode([
    'sucesso' => false,
    'status' => 'erro_validacao',
    'erro' => [
        'codigo' => 'erro_api',
        'mensagem' => trim($mensagemErro),
        'detalhes' => $respostaJson,
        'http_code' => $httpCode
    ],
    'debug' => [
        'empresa_id' => $empresaId,
        'emitente_id' => $emitente['id'],
        'cnpj_prestador' => $cnpjPrestador,
        'municipio' => $codigoMunicipio,
        'aliquota' => $aliquotaISS,
        'regime' => $codigoOpcaoSimplesNacional,
        'retencao' => $tipoRetencaoIss,
        'usar_ibs_cbs' => $usarIbsCbs,
        'envia_aliquota' => ($tipoRetencaoIss == 2 || $tipoRetencaoIss == 3) ? 'SIM' : 'NÃO'
    ]
]);
exit;
?>