<?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.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;
}

// 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.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 COMUNS DA NOTA
// ============================================================
$ref = trim($dados['nota']['ref']);
$valorServico = (float)$dados['nota']['valor_servico'];
$issRetido = $dados['nota']['iss_retido'] ?? true;
$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');

// ============================================================
// VERIFICAR TIPO DA EMPRESA
// ============================================================
$tipo_nfse = $empresa['tipo_nfse'] ?? 'nacional'; // 'nacional' (Tirentulho) ou 'canoas' (TR)

// ============================================================
// CONFIGURAÇÕES ESPECÍFICAS POR TIPO
// ============================================================
if ($tipo_nfse === 'canoas') {
    // Configurações da empresa TR (Canoas)
    $aliquotaISS = (float)($dados['nota']['aliquota'] ?? 4.00);
    $endpoint = '/nfsen';
    $codigoOpcaoSimplesNacional = ($empresa['optante_simples'] == 1) ? 3 : 1;
    $codigoNBS = "124032200";
    $codigoTributacaoMunicipalISS = "001";
    $tipo_retencao_iss = "2"; // Fixo para TR
    $valorISS = round(($valorServico * $aliquotaISS) / 100, 2);
    
    // Código do serviço para Canoas
    $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);
    
} else {
    // Configurações da empresa Tirentulho (Nacional)
    $aliquotaISS = (float)($dados['nota']['aliquota'] ?? 2.00);
    $endpoint = '/nfsen';
    $valorISS = round(($valorServico * $aliquotaISS) / 100, 2);
    
    // Código do serviço para Nacional
    $codigoServicoOriginal = preg_replace('/[^0-9]/', '', $dados['nota']['codigo_servico']);
    $codigoServico = str_pad(substr($codigoServicoOriginal, 0, 6), 6, '0', STR_PAD_RIGHT);
    
    // Código opção Simples Nacional
    $codigoOpcaoSimplesNacional = 1;
    if (isset($dados['nota']['codigo_opcao_simples_nacional'])) {
        $codigoOpcaoSimplesNacional = (int)$dados['nota']['codigo_opcao_simples_nacional'];
    } elseif ($emitente['optante_simples_nacional'] == 1) {
        $codigoOpcaoSimplesNacional = 3;
    }
}

// ============================================================
// 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 DE ACORDO COM O TIPO
// ============================================================
if ($tipo_nfse === 'canoas') {
    // ============================================================
    // PAYLOAD PARA CANOAS (empresa TR) - EXATAMENTE COMO FUNCIONA
    // ============================================================
    $payload = [
        "data_emissao" => $dataEmissao,
        "data_competencia" => $dataCompetencia,
        "codigo_municipio_emissora" => 4304606,
        "cnpj_prestador" => $cnpjPrestador,
        "inscricao_municipal_prestador" => $emitente['inscricao_municipal'] ?? '',
        "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" => 4304606,
        "codigo_tributacao_nacional_iss" => $codigoServico,
        "codigo_tributacao_municipal_iss" => $codigoTributacaoMunicipalISS,
        "descricao_servico" => $descricao,
        "valor_servico" => $valorServico,
        "tributacao_iss" => 1,
        "tipo_retencao_iss" => $tipo_retencao_iss,
        "indicador_total_tributacao" => "0",
        "codigo_nbs" => $codigoNBS
    ];
    
    if ($valorISS > 0) {
        $payload["valor_iss"] = $valorISS;
    }
    
} else {
    // ============================================================
    // PAYLOAD PARA TIRENTULHO (Nacional)
    // ============================================================
    $payload = [
        "data_emissao" => $dataEmissao,
        "data_competencia" => $dataCompetencia,
        "codigo_municipio_emissora" => (int)$emitente['codigo_municipio'],
        "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'],
        "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'] ?? '',
        "codigo_municipio_prestacao" => (int)$emitente['codigo_municipio'],
        "codigo_tributacao_nacional_iss" => $codigoServico,
        "codigo_nbs" => "121012200",
        "descricao_servico" => $descricao,
        "valor_servico" => $valorServico,
        "valor_iss" => $valorISS,
        "tributacao_iss" => 1,
        "tipo_retencao_iss" => $issRetido ? 1 : 2,
        "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",
        "indicador_total_tributacao" => null
    ];
    
    // 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, $issRetido ? 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 . $endpoint . '?ref=' . urlencode($ref);

// Log para debug
error_log("=== ENVIO NFSe ===");
error_log("Empresa: " . $empresa['nome']);
error_log("Tipo NFSe: " . $tipo_nfse);
error_log("URL: " . $url);
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]);
    
    if ($tipo_nfse === 'canoas') {
        $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]);
    } else {
        $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
    ]
]);
exit;
?>