<?php
session_start();
require_once 'mp-config.php';
include '../adm/config/db.php';
require_once __DIR__ . '/inc/mailer.php';
require_once __DIR__ . '/inc/email_templates.php';

if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    header("Location: checkout.php");
    exit;
}

// Validar token CSRF
if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== ($_SESSION['csrf_token'] ?? '')) {
    http_response_code(403);
    die("Requisição inválida. Por segurança, volte ao checkout e tente novamente.");
}


// 1. Coletar dados do formulário
$nome = $_POST['nome'] ?? '';
$email = trim($_POST['email'] ?? '');
$telefone = $_POST['telefone'] ?? '';
$cpf_cnpj = preg_replace('/\D/', '', $_POST['cpf_cnpj'] ?? '');
$cep = $_POST['cep'] ?? '';
$endereco = $_POST['endereco'] ?? '';
$numero = $_POST['numero'] ?? '';
$complemento = $_POST['complemento'] ?? '';
$bairro = $_POST['bairro'] ?? '';
$cidade = $_POST['cidade'] ?? '';
$estado = $_POST['estado'] ?? '';
$ponto_referencia = $_POST['ponto_referencia'] ?? '';

$carrinho = $_SESSION['carrinho'] ?? [];

if (empty($carrinho)) {
    die("Seu carrinho está vazio.");
}

// 2. Lógica de Usuário (Login/Cadastro Automático)
$usuario_id = $_SESSION['usuario_id'] ?? null;

if (!$usuario_id) {
    // Verifica se já existe um usuário com esse e-mail ou CPF
    $stmtCheck = $conn->prepare("SELECT id FROM usuarios WHERE email_principal = ? OR cpf_cnpj = ? LIMIT 1");
    $stmtCheck->bind_param("ss", $email, $cpf_cnpj);
    $stmtCheck->execute();
    $resCheck = $stmtCheck->get_result();
    
    if ($rowCheck = $resCheck->fetch_assoc()) {
        $usuario_id = $rowCheck['id'];
    } else {
        // Criar novo usuário (Guest Checkout)
        $senha = $_POST['senha'] ?? '';
        $senha_conf = $_POST['senha_conf'] ?? '';
        
        if (empty($senha) || $senha !== $senha_conf) {
            die("As senhas não conferem ou são inválidas.");
        }
        
        if (strlen($senha) < 6) {
            die("A senha deve ter pelo menos 6 caracteres.");
        }

        $senhaHash = password_hash($senha, PASSWORD_DEFAULT);
        $dataNow = date('Y-m-d H:i:s');
        
        $stmtNew = $conn->prepare("INSERT INTO usuarios (nome_completo, cpf_cnpj, email_principal, senha, status, data_cadastro, ncadastro, ponto_referencia, cep, endereco, numero, complemento, bairro, cidade, estado) VALUES (?, ?, ?, ?, 'ATIVO', ?, '', ?, ?, ?, ?, ?, ?, ?, ?)");
        $stmtNew->bind_param("ssssssssssssss", $nome, $cpf_cnpj, $email, $senhaHash, $dataNow, $ponto_referencia, $cep, $endereco, $numero, $complemento, $bairro, $cidade, $estado);
        if ($stmtNew->execute()) {
            $usuario_id = $conn->insert_id;
            // Login automático
            $_SESSION['usuario_id'] = $usuario_id;
            $_SESSION['usuario_nome'] = $nome;
        } else {
            die("Erro ao criar conta de usuário: " . $conn->error);
        }
    }
} else {
    // Se logado, atualizar endereço no perfil se o usuário permitiu ou se for automático
    $stmtUpUser = $conn->prepare("UPDATE usuarios SET ponto_referencia=?, cep=?, endereco=?, numero=?, complemento=?, bairro=?, cidade=?, estado=? WHERE id=?");
    $stmtUpUser->bind_param("ssssssssi", $ponto_referencia, $cep, $endereco, $numero, $complemento, $bairro, $cidade, $estado, $usuario_id);
    $stmtUpUser->execute();
}

// 3. Revalidar Preços com Motor Dinâmico de Atacado (igual ao carrinho.php)
require_once '../adm/config/price_helper.php';

// Passo A: Enriquecer itens e calcular totais globais
$enriq_pedido       = [];
$total_pecas_ped    = 0;
$qtd_por_prod_ped   = [];

foreach ($carrinho as $key => $item) {
    $id      = (int)$item['id'];
    $tamanho = $item['tamanho'] ?? '';
    $cor     = $item['cor']     ?? '';
    $numero  = $item['numero']  ?? '';

    $res = $conn->query("SELECT * FROM produtos WHERE id = $id LIMIT 1");
    if (!$res || $res->num_rows === 0) continue;

    $produto  = $res->fetch_assoc();
    $variacao = [];
    if ($tamanho !== '' || $cor !== '' || $numero !== '') {
        $st = $conn->prepare("SELECT * FROM produto_variacoes WHERE produto_id=? AND tamanho=? AND cor=? AND numero=? LIMIT 1");
        if ($st) {
            $st->bind_param("isss", $id, $tamanho, $cor, $numero);
            $st->execute();
            $rv = $st->get_result();
            if ($rv && $rv->num_rows > 0) $variacao = $rv->fetch_assoc();
        }
    }

    $calc = calcularPrecoVariacao($variacao, $produto);
    $enriq_pedido[$key] = ['produto' => $produto, 'calc' => $calc];

    // ISOLAMENTO: só itens COM preco_atacado entram no total global de peças
    if ($calc['em_atacado'] && $calc['preco_atacado'] !== null) {
        $total_pecas_ped += (int)$item['quantidade'];
    }
    $qtd_por_prod_ped[$id] = ($qtd_por_prod_ped[$id] ?? 0) + (int)$item['quantidade'];
}

// Passo B: Total de varejo apenas dos itens COM atacado (regra valor_global)
// Itens varejo-only não contribuem para o limiar de ativação do atacado
$total_varejo_ped = 0.0;
foreach ($enriq_pedido as $key => $enr) {
    $c = $enr['calc'];
    // Apenas itens com preço de atacado configurado
    if (!$c['em_atacado'] || $c['preco_atacado'] === null) continue;
    $preco_base = ($c['em_promocao'] && $c['preco_promocional'] !== null) ? $c['preco_promocional'] : $c['preco_varejo'];
    $total_varejo_ped += $preco_base * (int)$carrinho[$key]['quantidade'];
}

// Passo C: Aplicar regra e calcular preço final
$total = 0;
foreach ($carrinho as $key => &$item) {
    if (!isset($enriq_pedido[$key])) {
        $total += ($item['preco'] ?? 0) * ($item['quantidade'] ?? 1);
        continue;
    }
    $produto = $enriq_pedido[$key]['produto'];
    $calc    = $enriq_pedido[$key]['calc'];
    $pid     = (int)$item['id'];

    $preco_sem_atacado = ($calc['em_promocao'] && $calc['preco_promocional'] !== null)
        ? $calc['preco_promocional'] : $calc['preco_varejo'];

    $tem_atacado   = $calc['em_atacado'] && $calc['preco_atacado'] !== null;
    $atacado_ativo = false;
    $regra    = $produto['regra_atacado']    ?? 'padrao';
    $min_qtd  = (int)($produto['atacado_min_qtd']   ?? 6);
    $min_valor= (float)($produto['atacado_min_valor'] ?? 0);

    if ($tem_atacado) {
        switch ($regra) {
            case 'padrao':      $atacado_ativo = ($total_pecas_ped >= $min_qtd); break;
            case 'valor_global':$atacado_ativo = ($total_varejo_ped >= $min_valor); break;
            case 'referencia':  $atacado_ativo = (($qtd_por_prod_ped[$pid] ?? 0) >= $min_qtd); break;
            case 'grade':       $atacado_ativo = true; break;
        }
    }

    $item['preco'] = ($tem_atacado && $atacado_ativo) ? $calc['preco_atacado'] : $preco_sem_atacado;
    $total += $item['preco'] * (int)$item['quantidade'];
}
unset($item);
$_SESSION['carrinho'] = $carrinho;

// 4. Gravar Pedido no Banco
$conn->begin_transaction();

try {
    // Insere Pedido vinculado ao usuario_id
    $sqlPedido = "INSERT INTO pedidos (usuario_id, total, status, metodo_pagamento, status_pagamento, external_reference) 
                  VALUES (?, ?, 'pendente', 'Mercado Pago', 'pending', ?)";
    $stmt = $conn->prepare($sqlPedido);
    $extRef = uniqid('PED_'); 
    $stmt->bind_param("ids", $usuario_id, $total, $extRef);
    $stmt->execute();
    $pedido_id = $conn->insert_id;

    // Insere Itens do Pedido
    $sqlItens = "INSERT INTO pedidos_itens (pedido_id, produto_id, quantidade, preco, nome_produto, tamanho, cor, numero) VALUES (?, ?, ?, ?, ?, ?, ?, ?)";
    $stmtItens = $conn->prepare($sqlItens);
    foreach ($carrinho as $item) {
        $t = $item['tamanho'] ?? null;
        $c = $item['cor']    ?? null;
        $n = $item['numero'] ?? null;
        $stmtItens->bind_param("iiidssss", $pedido_id, $item['id'], $item['quantidade'], $item['preco'], $item['nome'], $t, $c, $n);
        $stmtItens->execute();
    }

    // Insere Endereço
    $sqlEnd = "INSERT INTO pedidos_endereco (pedido_id, nome, endereco, numero, complemento, bairro, cidade, estado, cep, ponto_referencia) 
               VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
    $stmtEnd = $conn->prepare($sqlEnd);
    $stmtEnd->bind_param("isssssssss", $pedido_id, $nome, $endereco, $numero, $complemento, $bairro, $cidade, $estado, $cep, $ponto_referencia);
    $stmtEnd->execute();

    $conn->commit();

    // E-mail de confirmação do pedido ao cliente
    try {
        // Busca itens recém inseridos
        $stmtItensEmail = $conn->prepare("SELECT * FROM pedidos_itens WHERE pedido_id = ?");
        $stmtItensEmail->bind_param("i", $pedido_id);
        $stmtItensEmail->execute();
        $itensEmail = $stmtItensEmail->get_result()->fetch_all(MYSQLI_ASSOC);

        // Busca endereço
        $stmtEndEmail = $conn->prepare("SELECT * FROM pedidos_endereco WHERE pedido_id = ? LIMIT 1");
        $stmtEndEmail->bind_param("i", $pedido_id);
        $stmtEndEmail->execute();
        $endEmail = $stmtEndEmail->get_result()->fetch_assoc() ?? [];

        $loja      = _getLojaEmailData($conn);
        $assunto   = '📦 Pedido #' . $pedido_id . ' recebido! | ' . $loja['nome'];
        $htmlEmail = emailConfirmacaoPedido($pedido_id, $itensEmail, $total, $endEmail, 'pendente', $loja);
        enviarEmail($email, $nome, $assunto, $htmlEmail);
    } catch (\Throwable $ex) {
        error_log('[PEDIDO-EMAIL] ' . $ex->getMessage());
    }

    // 5. Gerar Preferência no Mercado Pago (API REST)
    $mpItems = [];
    foreach ($carrinho as $item) {
        $mpItems[] = [
            "title" => $item['nome'],
            "quantity" => (int)$item['quantidade'],
            "unit_price" => (float)$item['preco'],
            "currency_id" => "BRL"
        ];
    }

    $preferenceData = [
        "items" => $mpItems,
        "payer" => [
            "name" => $nome,
            "email" => $email,
            "phone" => [
                "number" => preg_replace('/\D/', '', $telefone)
            ],
            "identification" => [
                "type" => (strlen($cpf_cnpj) > 11) ? "CNPJ" : "CPF",
                "number" => $cpf_cnpj
            ],
            "address" => [
                "street_name" => $endereco,
                "street_number" => (int)$numero,
                "zip_code" => preg_replace('/\D/', '', $cep)
            ]
        ],
        "back_urls" => [
            "success" => MP_URL_SUCCESS . "?pedido_id=" . $pedido_id,
            "failure" => MP_URL_FAILURE,
            "pending" => MP_URL_PENDING . "?pedido_id=" . $pedido_id
        ],
        "auto_return" => "approved",
        "external_reference" => $extRef,
        "notification_url" => MP_URL_WEBHOOK
    ];

    // Log de depuração
    $logData = [
        'timestamp' => date('Y-m-d H:i:s'),
        'preference_data' => $preferenceData
    ];
    file_put_contents('mp_debug_log.txt', json_encode($logData, JSON_PRETTY_PRINT) . "\n", FILE_APPEND);

    $ch = curl_init('https://api.mercadopago.com/checkout/preferences');
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        'Content-Type: application/json',
        'Authorization: Bearer ' . MP_ACCESS_TOKEN
    ]);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($preferenceData));
    
    $response = curl_exec($ch);
    $preference = json_decode($response, true);
    curl_close($ch);

    // Log da resposta
    file_put_contents('mp_debug_log.txt', "RESPONSE: " . $response . "\n\n", FILE_APPEND);

    if (isset($preference['init_point'])) {

        $sqlUp = "UPDATE pedidos SET preference_id = ? WHERE id = ?";
        $stmtUp = $conn->prepare($sqlUp);
        $stmtUp->bind_param("si", $preference['id'], $pedido_id);
        $stmtUp->execute();

        $_SESSION['carrinho'] = [];
        header("Location: " . $preference['init_point']);
    } else {
        echo "Erro ao gerar pagamento: " . ($preference['message'] ?? 'Erro desconhecido');
    }

} catch (Exception $e) {
    if (isset($conn) && $conn->connect_errno == 0 && method_exists($conn, 'rollback')) {
        $conn->rollback();
    }
    die("Erro ao processar pedido: " . $e->getMessage());
}
