<?php
/**
 * Helpers globais
 * Localização: /app/helpers/functions.php
 */

/** Escapa HTML */
function e($value): string
{
    return htmlspecialchars((string)$value, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
}

/** Monta URL pública */
function url(string $path = ''): string
{
    return BASE_URL . '/' . ltrim($path, '/');
}

/** Monta URL admin */
function admin_url(string $path = ''): string
{
    return ADMIN_URL . '/' . ltrim($path, '/');
}

/** Monta URL de upload */
function upload_url(string $file): string
{
    if (!$file) return '';
    return UPLOADS_URL . '/' . ltrim($file, '/');
}

/** Gera slug */
function slugify(string $text): string
{
    $text = mb_strtolower($text, 'UTF-8');
    $text = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $text);
    $text = preg_replace('/[^a-z0-9]+/', '-', $text);
    return trim($text, '-') ?: 'item';
}

/** CSRF token */
function csrf_token(): string
{
    if (empty($_SESSION[CSRF_TOKEN_NAME])) {
        $_SESSION[CSRF_TOKEN_NAME] = bin2hex(random_bytes(32));
    }
    return $_SESSION[CSRF_TOKEN_NAME];
}

function csrf_field(): string
{
    return '<input type="hidden" name="' . CSRF_TOKEN_NAME . '" value="' . csrf_token() . '">';
}

/** Formata preço BR */
function price(?float $value): string
{
    if ($value === null) return '';
    return 'R$ ' . number_format($value, 2, ',', '.');
}

/** Formata data BR */
function date_br($date, bool $withTime = false): string
{
    if (!$date) return '';
    $fmt = $withTime ? 'd/m/Y H:i' : 'd/m/Y';
    return date($fmt, strtotime($date));
}

/** Flash message */
function flash(string $type): ?string
{
    $msg = $_SESSION['flash'][$type] ?? null;
    if ($msg) unset($_SESSION['flash'][$type]);
    return $msg;
}

function has_flash(string $type): bool
{
    return !empty($_SESSION['flash'][$type]);
}

/** Verifica se é rota ativa */
function is_active(string $path): string
{
    $current = $_SERVER['REQUEST_URI'] ?? '';
    return strpos($current, $path) !== false ? 'active' : '';
}

/** Gera código único para pedido */
function gerar_codigo_pedido(): string
{
    return 'OFC-' . date('Ymd') . '-' . strtoupper(substr(bin2hex(random_bytes(3)), 0, 5));
}

/** Trunca texto */
function truncate(string $text, int $limit = 120, string $end = '...'): string
{
    $text = strip_tags($text);
    if (mb_strlen($text) <= $limit) return $text;
    return mb_substr($text, 0, $limit) . $end;
}

/** Estados brasileiros */
function estados_br(): array
{
    return [
        'AC'=>'Acre','AL'=>'Alagoas','AP'=>'Amapá','AM'=>'Amazonas','BA'=>'Bahia',
        'CE'=>'Ceará','DF'=>'Distrito Federal','ES'=>'Espírito Santo','GO'=>'Goiás',
        'MA'=>'Maranhão','MT'=>'Mato Grosso','MS'=>'Mato Grosso do Sul','MG'=>'Minas Gerais',
        'PA'=>'Pará','PB'=>'Paraíba','PR'=>'Paraná','PE'=>'Pernambuco','PI'=>'Piauí',
        'RJ'=>'Rio de Janeiro','RN'=>'Rio Grande do Norte','RS'=>'Rio Grande do Sul',
        'RO'=>'Rondônia','RR'=>'Roraima','SC'=>'Santa Catarina','SP'=>'São Paulo',
        'SE'=>'Sergipe','TO'=>'Tocantins'
    ];
}

/** Status do pedido */
function status_pedido(): array
{
    return [
        'novo'       => ['label' => 'Novo', 'cor' => 'primary'],
        'em_analise' => ['label' => 'Em Análise', 'cor' => 'warning'],
        'aprovado'   => ['label' => 'Aprovado', 'cor' => 'info'],
        'enviado'    => ['label' => 'Enviado', 'cor' => 'secondary'],
        'concluido'  => ['label' => 'Concluído', 'cor' => 'success'],
        'cancelado'  => ['label' => 'Cancelado', 'cor' => 'danger'],
    ];
}

/** Upload de imagem */
function upload_imagem(array $file, string $destino): ?string
{
    if (empty($file['tmp_name']) || $file['error'] !== UPLOAD_ERR_OK) {
        return null;
    }
    if ($file['size'] > MAX_UPLOAD_SIZE) {
        return null;
    }

    $info = getimagesize($file['tmp_name']);
    if (!$info || !in_array($info['mime'], ALLOWED_IMAGE_TYPES, true)) {
        return null;
    }

    $ext = pathinfo($file['name'], PATHINFO_EXTENSION);
    $ext = strtolower($ext ?: 'jpg');
    $nome = uniqid('', true) . '.' . $ext;
    $pastaCompleta = UPLOADS_PATH . '/' . trim($destino, '/');
    if (!is_dir($pastaCompleta)) {
        mkdir($pastaCompleta, 0755, true);
    }
    $caminho = $pastaCompleta . '/' . $nome;

    if (move_uploaded_file($file['tmp_name'], $caminho)) {
        return trim($destino, '/') . '/' . $nome;
    }
    return null;
}

/** Obtém configurações (cache estático) */
function config_marca(): array
{
    static $cache = null;
    if ($cache !== null) return $cache;
    $db = Database::getInstance();
    $cache = $db->query("SELECT * FROM configuracoes WHERE id = 1")->fetch() ?: [];
    return $cache;
}

/** Pega a quantidade de itens no carrinho */
function cart_count(): int
{
    return array_sum(array_column($_SESSION['cart'] ?? [], 'quantidade'));
}

/** Formata telefone com WhatsApp */
function whatsapp_link(string $numero, string $texto = ''): string
{
    $numero = preg_replace('/\D/', '', $numero);
    return 'https://wa.me/' . $numero . ($texto ? '?text=' . urlencode($texto) : '');
}
