<?php
session_start();
header('Content-Type: application/json');

require_once __DIR__ . '/../adm/config/db.php';
require_once __DIR__ . '/../adm/config/price_helper.php';

if (!isset($_SESSION['carrinho'])) {
    $_SESSION['carrinho'] = [];
}

// =========================
// ADICIONAR PRODUTO
// =========================
if (isset($_POST['add'])) {
    $id      = intval($_POST['id']);
    $nome    = $_POST['nome'] ?? '';
    $preco   = floatval($_POST['preco']);
    $tamanho = $_POST['tamanho'] ?? null;
    $cor     = $_POST['cor']     ?? null;
    $numero  = $_POST['numero']  ?? null;
    $qtd     = max(1, intval($_POST['quantidade'] ?? 1));

    $unique_key = md5($id . ($tamanho ?? '') . ($cor ?? '') . ($numero ?? ''));

    if (isset($_SESSION['carrinho'][$unique_key])) {
        $_SESSION['carrinho'][$unique_key]['quantidade'] += $qtd;
    } else {
        $_SESSION['carrinho'][$unique_key] = [
            'unique_key' => $unique_key,
            'id'         => $id,
            'nome'       => $nome,
            'preco'      => $preco,
            'quantidade' => $qtd,
            'tamanho'    => $tamanho,
            'cor'        => $cor,
            'numero'     => $numero,
        ];
    }
}

// =========================
// ATUALIZAR QUANTIDADE
// =========================
if (isset($_POST['update'])) {
    $unique_key = $_POST['unique_key'] ?? '';
    $quantidade = intval($_POST['quantidade']);
    if ($quantidade <= 0) {
        unset($_SESSION['carrinho'][$unique_key]);
    } elseif (isset($_SESSION['carrinho'][$unique_key])) {
        $_SESSION['carrinho'][$unique_key]['quantidade'] = $quantidade;
    }
}

// =========================
// REMOVER ITEM
// =========================
if (isset($_POST['remove'])) {
    $unique_key = $_POST['unique_key'] ?? '';
    unset($_SESSION['carrinho'][$unique_key]);
}

// =====================================================================
// MOTOR DE PREÇO DINÂMICO COM REGRAS DE ATACADO
// =====================================================================

// --- PASSO 1: Enriquecer cada item com dados do banco ---
$enriquecidos        = [];
$total_pecas_global  = 0;
$avisos              = [];

foreach ($_SESSION['carrinho'] as $uk => &$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();
        }
    }

    // Ajusta estoque máximo
    $vender_sem_estoque = $produto['vender_sem_estoque'] ?? 'não';
    if ($vender_sem_estoque === 'não') {
        $maxEstoque = !empty($variacao) ? (int)$variacao['estoque'] : (int)$produto['estoque'];
        
        if ($maxEstoque <= 0) {
            unset($_SESSION['carrinho'][$uk]);
            $avisos[] = "O produto '{$produto['nome']}' esgotou e foi removido do carrinho.";
            continue; // Remove do carrinho e pula
        } elseif ($item['quantidade'] > $maxEstoque) {
            $item['quantidade'] = $maxEstoque;
            $_SESSION['carrinho'][$uk]['quantidade'] = $maxEstoque;
            $avisos[] = "Temos apenas {$maxEstoque} unidade(s) de '{$produto['nome']}' disponíveis em estoque.";
        }
    }

    $calc = calcularPrecoVariacao($variacao, $produto);

    $enriquecidos[$uk] = [
        'produto'  => $produto,
        'variacao' => $variacao,
        'calc'     => $calc,
    ];

    // ─── ISOLAMENTO VAREJO / ATACADO ────────────────────────────────────
    // Apenas itens que têm preco_atacado configurado entram nos totais
    // globais de ativação. Produtos varejo-only (sem preco_atacado) NUNCA
    // contribuem para ativar o desconto de atacado de outros produtos.
    if ($calc['em_atacado'] && $calc['preco_atacado'] !== null) {
        $total_pecas_global += (int)$item['quantidade'];
    }
}
unset($item);

// --- PASSO 2: Total de varejo global dos itens COM atacado (regra valor_global) ---
// Igualmente: só itens com atacado configurado contam para o limiar de valor.
// Itens varejo-only ficam completamente fora do cálculo de ativação.
$total_varejo_global = 0.0;
foreach ($enriquecidos as $uk => $enr) {
    $calc = $enr['calc'];
    // Ignora itens sem preço de atacado — eles são sempre varejo
    if (!$calc['em_atacado'] || $calc['preco_atacado'] === null) continue;
    $qtd  = (int)$_SESSION['carrinho'][$uk]['quantidade'];
    $preco_base = ($calc['em_promocao'] && $calc['preco_promocional'] !== null)
        ? $calc['preco_promocional']
        : $calc['preco_varejo'];
    $total_varejo_global += $preco_base * $qtd;
}

// --- PASSO 3: Qtd por produto_id (para regra referencia) ---
$qtd_por_produto = [];
foreach ($_SESSION['carrinho'] as $uk => $item) {
    $pid = (int)$item['id'];
    $qtd_por_produto[$pid] = ($qtd_por_produto[$pid] ?? 0) + (int)$item['quantidade'];
}

// --- PASSO 4: Aplicar regra e calcular preço final por item ---
$total_final      = 0.0;
$progresso_global = null; // Info da barra de progresso

foreach ($_SESSION['carrinho'] as $uk => &$item) {
    if (!isset($enriquecidos[$uk])) {
        $total_final += ($item['preco'] ?? 0) * ($item['quantidade'] ?? 1);
        continue;
    }

    $enr     = $enriquecidos[$uk];
    $produto = $enr['produto'];
    $calc    = $enr['calc'];

    // Preço ativo sem atacado
    $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);
    $pid        = (int)$item['id'];

    if ($tem_atacado) {
        switch ($regra) {
            case 'padrao':
                $atacado_ativo = ($total_pecas_global >= $min_qtd);
                // Alimenta progresso global (usa a primeira regra 'padrao' encontrada)
                if ($progresso_global === null) {
                    $progresso_global = [
                        'regra'  => 'padrao',
                        'atual'  => $total_pecas_global,
                        'minimo' => $min_qtd,
                        'ativo'  => $atacado_ativo,
                        'faltam' => max(0, $min_qtd - $total_pecas_global),
                        'label'  => 'peças',
                    ];
                }
                break;

            case 'valor_global':
                $atacado_ativo = ($total_varejo_global >= $min_valor);
                if ($progresso_global === null) {
                    $progresso_global = [
                        'regra'  => 'valor_global',
                        'atual'  => $total_varejo_global,
                        'minimo' => $min_valor,
                        'ativo'  => $atacado_ativo,
                        'faltam' => max(0, $min_valor - $total_varejo_global),
                        'label'  => 'valor',
                    ];
                }
                break;

            case 'referencia':
                $qtd_este = $qtd_por_produto[$pid] ?? 0;
                $atacado_ativo = ($qtd_este >= $min_qtd);
                break;

            case 'grade':
                $atacado_ativo = true; // Grade fechada: sempre no preço de atacado
                break;
        }
    }

    // Preço final do item
    $preco_aplicado = ($tem_atacado && $atacado_ativo)
        ? $calc['preco_atacado']
        : $preco_sem_atacado;

    // Qtd deste produto no carrinho (para exibir progresso referencia no front)
    $qtd_este_produto = $qtd_por_produto[$pid] ?? 0;

    $item['preco']          = $preco_aplicado;
    $item['atacado_ativo']  = $atacado_ativo;
    $item['tem_atacado']    = $tem_atacado;
    $item['preco_varejo']   = $calc['preco_varejo'];
    $item['preco_promo']    = $calc['preco_promocional'];
    $item['preco_atacado']  = $calc['preco_atacado'];
    $item['regra_atacado']  = $regra;
    $item['min_qtd']        = $min_qtd;
    $item['min_valor']      = $min_valor;
    $item['qtd_produto']    = $qtd_este_produto; // para barra referencia

    $total_final += $preco_aplicado * (int)$item['quantidade'];
}
unset($item);

// =========================
// RETORNO JSON
// =========================
session_write_close();

echo json_encode([
    'carrinho'        => array_values($_SESSION['carrinho']),
    'total'           => $total_final,
    'total_pecas'     => $total_pecas_global,
    'total_varejo'    => $total_varejo_global,
    'progresso'       => $progresso_global,
    'avisos'          => $avisos
]);