<?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
$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;
} else {
    $codigoServico = str_pad(
        substr($codigoServicoNumerico, 0, 6),
        6,
        '0',
        STR_PAD_RIGHT
    );
}

// ============================================================
// CONFIGURAÇÕES POR EMPRESA
// ============================================================
$empresaId = (int)$empresa['id'];

// Parâmetros padrão
$aliquotaISS = 4.00;
$codigoNBS = "124032200";
$codigoOpcaoSimplesNacional = 3;
$tipoRetencaoIss = 2;
$codigoMunicipio = 4304606;
$inscricaoMunicipal = preg_replace('/[^0-9]/', '', $emitente['inscricao_municipal'] ?? '');
$regimeTributarioSimplesNacional = 1;

// Configurar por empresa
if ($empresaId == 1) {
    // TIRENTULHO
    $aliquotaISS = 2.00;
    $codigoNBS = "121012200";
    $codigoOpcaoSimplesNacional = 3;
    $tipoRetencaoIss = 1;
    $codigoMunicipio = 4314902;
    $regimeTributarioSimplesNacional = 1;
} elseif ($empresaId == 2) {
    // TR
    $aliquotaISS = 5.00;
    $codigoNBS = "124032200";
    $codigoOpcaoSimplesNacional = 1;
    $tipoRetencaoIss = 2;
    $codigoMunicipio = 4304606;
    $regimeTributarioSimplesNacional = 1;
} elseif ($empresaId == 3) {
    // RECILUX
    $aliquotaISS = 2.01;
    $codigoNBS = "124033200";
    $codigoOpcaoSimplesNacional = 3;
    $tipoRetencaoIss = 2;
    $codigoMunicipio = 4304606;
    $regimeTributarioSimplesNacional = 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;
}

// ============================================================
// PAYLOAD JSON - COM IBS/CBS
// ============================================================
$payload = [
    // Dados básicos
    "data_emissao" => $dataEmissao,
    "data_competencia" => $dataCompetencia,
    "codigo_municipio_emissora" => $codigoMunicipio,
    "cnpj_prestador" => $cnpjPrestador,
    "inscricao_municipal_prestador" => $inscricaoMunicipal,
    "codigo_opcao_simples_nacional" => $codigoOpcaoSimplesNacional,
    "regime_especial_tributacao" => 0,
    "regime_tributario_simples_nacional" => $regimeTributarioSimplesNacional,
    
    // Tomador
    "cnpj_tomador" => $cnpjTomador,
    "razao_social_tomador" => substr($tomador['razao_social'], 0, 100),
    "codigo_municipio_tomador" => (int)$tomador['codigo_municipio'],
    "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'] ?? '', 0, 50),
    "telefone_tomador" => preg_replace('/[^0-9]/', '', $tomador['telefone'] ?? ''),
    "email_tomador" => $tomador['email'] ?? '',
    
    // Serviço
    "codigo_municipio_prestacao" => (int)($dados['nota']['municipio_prestacao'] ?? $codigoMunicipio),
    "codigo_tributacao_nacional_iss" => $codigoServico,
    "codigo_tributacao_municipal_iss" => "001",
    "codigo_nbs" => $codigoNBS,
    "descricao_servico" => $descricao,
    
    // Valores
    "valor_servico" => $valorServico,
    "valor_iss" => $valorISS,
    "percentual_aliquota_relativa_municipio" => number_format($aliquotaISS, 2, '.', ''),
    "tributacao_iss" => 1,
    "tipo_retencao_iss" => $tipoRetencaoIss,
    "percentual_total_tributos_federais" => "0.00",
    "percentual_total_tributos_estaduais" => "0.00",
    "percentual_total_tributos_municipais" => number_format($aliquotaISS, 2, '.', ''),
    "situacao_tributaria_pis_cofins" => "00",
    
    // ============================================================
    // IBS/CBS - Novos campos obrigatórios a partir de 01/01/2026
    // ============================================================
    "indicador_total_tributacao" => null,
    "finalidade_emissao" => $dados['nota']['finalidade_emissao'] ?? "0",
    "consumidor_final" => $dados['nota']['consumidor_final'] ?? "0",
    "codigo_indicador_operacao" => $dados['nota']['codigo_indicador_operacao'] ?? "050102",
    "indicador_destinatario" => $dados['nota']['indicador_destinatario'] ?? "0",
    "ibs_cbs_situacao_tributaria" => $dados['nota']['ibs_cbs_situacao_tributaria'] ?? "000",
    "ibs_cbs_classificacao_tributaria" => $dados['nota']['ibs_cbs_classificacao_tributaria'] ?? "000001",
    "compra_governamental" => $dados['nota']['compra_governamental'] ?? "0",
    "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())
");

$stmt->execute([
    $empresa['id'], $emitente['id'], $tomador['id'], $ref, $codigoServico, $descricao,
    $valorServico, $aliquotaISS, $valorISS, ($tipoRetencaoIss == 2) ? 1 : 0,
    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 . '/nfsen?ref=' . urlencode($ref);

error_log("=== ENVIO JSON COM IBS/CBS ===");
error_log("URL: " . $url);
error_log("Empresa: " . $empresa['nome']);
error_log("Alíquota: " . $aliquotaISS . "%");
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]);
    $protocolo = $respostaJson['protocolo'] ?? $respostaJson['numero'] ?? null;
    $status = $respostaJson['status'] ?? 'processando_autorizacao';
    
    if ($protocolo) {
        $pdo->prepare("UPDATE notas_fiscais SET numero_nfse = ?, status = ? WHERE id = ?")->execute([$protocolo, $status, $nota_id]);
    } else {
        $pdo->prepare("UPDATE notas_fiscais SET status = ? WHERE id = ?")->execute([$status, $nota_id]);
    }
    
    echo json_encode([
        'sucesso' => true,
        'status' => $status,
        'protocolo' => $protocolo,
        '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' => [
        'aliquota' => $aliquotaISS,
        'empresa' => $empresa['nome'],
        'ibs_cbs' => [
            'finalidade_emissao' => $payload['finalidade_emissao'],
            'consumidor_final' => $payload['consumidor_final'],
            'codigo_indicador_operacao' => $payload['codigo_indicador_operacao'],
            'indicador_destinatario' => $payload['indicador_destinatario'],
            'ibs_cbs_situacao_tributaria' => $payload['ibs_cbs_situacao_tributaria'],
            'ibs_cbs_classificacao_tributaria' => $payload['ibs_cbs_classificacao_tributaria'],
            'compra_governamental' => $payload['compra_governamental']
        ]
    ]
]);
exit;
?>