<?php
/**
 * ============================================================
 * Configuração Principal - MontaLoja SaaS
 * ============================================================
 */

// Previne acesso direto
if (!defined('BARBERFLOW')) {
    define('BARBERFLOW', true);
}

// Ambiente
define('APP_ENV', getenv('APP_ENV') ?: 'production');
define('APP_DEBUG', filter_var(getenv('APP_DEBUG'), FILTER_VALIDATE_BOOLEAN));
define('APP_URL', getenv('APP_URL') ?: 'https://tiuoficial.com.br');
define('APP_NAME', 'MontaLoja');

// Carrega variáveis de ambiente
require_once __DIR__ . '/env_loader.php';
loadEnv(__DIR__ . '/../.env');

// Banco de dados
define('DB_HOST', getenv('DB_HOST'));
define('DB_NAME', getenv('DB_NAME'));
define('DB_USER', getenv('DB_USER'));
define('DB_PASS', getenv('DB_PASS'));
define('DB_CHARSET', getenv('DB_CHARSET') ?: 'utf8mb4');

// Store padrão (fallback) - só define se não existir
// REMOVIDO: if (!defined('STORE_ID')) define('STORE_ID', 1);
// REMOVIDO: if (!defined('STORE_NAME')) define('STORE_NAME', 'Loja Demo');
if (!defined('STORE_URL')) define('STORE_URL', getenv('APP_URL') ?: 'https://tiuoficial.com.br');
if (!defined('WHATSAPP_NUMBER')) define('WHATSAPP_NUMBER', '5511999999999');

// Sessão
define('SESSION_LIFETIME', 7200); // 2 horas
define('SESSION_NAME', 'montaloja_session');

// Timezone
date_default_timezone_set('America/Sao_Paulo');

// Conexão PDO
function getDB(): PDO {
    static $pdo = null;

    if ($pdo === null) {
        try {
            if (empty(DB_HOST)) {
                die('<b>ERRO CRÍTICO:</b> Variáveis de ambiente não carregadas. Verifique se o arquivo .env está na raiz do site.');
            }

            $dsn = 'mysql:host=' . DB_HOST . ';dbname=' . DB_NAME . ';charset=' . DB_CHARSET;
            $pdo = new PDO($dsn, DB_USER, DB_PASS, [
                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
                PDO::ATTR_EMULATE_PREPARES => false,
            ]);
            $pdo->exec("SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci'");
        } catch (PDOException $e) {
            // FORÇANDO EXIBIÇÃO DO ERRO PARA DIAGNÓSTICO
            die('Erro de conexão DETALHADO: ' . $e->getMessage() . ' <br>HOST: ' . DB_HOST);
        }
    }

    return $pdo;
}

// Helpers de Tenant
function getCurrentStoreId(): int {
    return $_SESSION['tenant_id'] ?? STORE_ID;
}

function getCurrentStore(): ?array {
    static $store = null;

    if ($store === null) {
        $storeId = getCurrentStoreId();
        $pdo = getDB();
        $stmt = $pdo->prepare('SELECT * FROM stores WHERE id = ? AND deleted_at IS NULL');
        $stmt->execute([$storeId]);
        $store = $stmt->fetch() ?: null;
    }

    return $store;
}

function setCurrentTenant(int $storeId): void {
    $_SESSION['tenant_id'] = $storeId;
}

// Formatação
function formatMoney($value): string {
    return 'R$ ' . number_format((float)$value, 2, ',', '.');
}

function formatRelativeTime($datetime): string {
    if (!$datetime) return 'Nunca';

    $timestamp = is_string($datetime) ? strtotime($datetime) : $datetime;
    $diff = time() - $timestamp;

    if ($diff < 60) return 'Agora mesmo';
    if ($diff < 3600) return floor($diff / 60) . ' min atrás';
    if ($diff < 86400) return floor($diff / 3600) . 'h atrás';
    if ($diff < 604800) return floor($diff / 86400) . ' dias atrás';

    return date('d/m/Y', $timestamp);
}

// Super Admin
function isSuperAdmin(): bool {
    return isset($_SESSION['is_super_admin']) && $_SESSION['is_super_admin'] === true;
}

function getSuperAdmin(): ?array {
    if (!isSuperAdmin() || empty($_SESSION['super_admin_id'])) {
        return null;
    }

    $pdo = getDB();
    $stmt = $pdo->prepare('SELECT * FROM super_admins WHERE id = ? AND is_active = 1');
    $stmt->execute([$_SESSION['super_admin_id']]);
    return $stmt->fetch() ?: null;
}

function isImpersonating(): bool {
    return isset($_SESSION['impersonating']) && $_SESSION['impersonating'] === true;
}

// Inicializa sessão
if (session_status() === PHP_SESSION_NONE) {
    session_name(SESSION_NAME);
    session_start();
}

// ============================================================
// Função Global para URL da Loja
// ============================================================

/**
 * Retorna a URL correta da loja baseada na configuração de domínio
 * 
 * @param array $store Dados da loja (deve conter: slug, subdomain, domain_type, custom_domain)
 * @return string URL completa da loja
 */
function get_store_url($store): string {
    $currentHost = $_SERVER['HTTP_HOST'] ?? getenv('SYSTEM_DOMAIN') ?: 'tiuoficial.com.br';
    $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? "https://" : "http://";
    $baseUrl = $protocol . $currentHost;
    
    $domainType = $store['domain_type'] ?? 'subdomain';
    $customDomain = $store['custom_domain'] ?? '';
    $subdomain = $store['subdomain'] ?? $store['slug'] ?? '';
    $slug = $store['slug'] ?? $subdomain;

    // 0. Se acesso é via /loja/{slug}, manter no path
    $currentUri = $_SERVER['REQUEST_URI'] ?? '';
    if (strpos($currentUri, '/loja/') === 0) {
        return $baseUrl . '/loja/' . $slug;
    }

    // 1. Prioridade: Domínio Próprio (se estiver configurado e ativo)
    if ($domainType === 'custom' && !empty($customDomain)) {
        $dom = $customDomain;
        // Garante o protocolo
        if (strpos($dom, 'http') === false) {
            $dom = 'https://' . $dom;
        }
        return rtrim($dom, '/');
    }
    
    // 2. Prioridade: Subdomínio
    if ($domainType === 'subdomain' && !empty($subdomain)) {
        // Se já estamos no subdomínio correto, retornar a URL base atual
        if (strpos($currentHost, $subdomain . '.') === 0) {
            return $baseUrl;
        }
        // Determinar o domínio base a partir do host atual
        // Ex: acessorios.localhost → localhost | acessorios.tiuoficial.com.br → tiuoficial.com.br
        $hostParts = explode('.', $currentHost);
        if (count($hostParts) >= 2) {
            // Remover o primeiro segmento (subdomínio atual) para obter o base domain
            array_shift($hostParts);
            $base = implode('.', $hostParts);
        } else {
            // Host simples (localhost sem subdomínio)
            $base = $currentHost;
        }
        // Se não conseguiu determinar, usar SYSTEM_DOMAIN como fallback
        if (empty($base) || $base === 'com.br') {
            $base = getenv('SYSTEM_DOMAIN') ?: 'tiuoficial.com.br';
        }
        return $protocol . $subdomain . '.' . $base;
    }
    
    // 3. Fallback: Caminho (Path)
    return $baseUrl . '/loja/' . $slug;
}

/**
 * Retorna a URL da loja atual da sessão
 * Útil para uso rápido em templates
 * 
 * @return string URL completa da loja
 */
function get_current_store_url(): string {
    $store = getCurrentStore();
    if (!$store) {
        $currentHost = $_SERVER['HTTP_HOST'] ?? getenv('SYSTEM_DOMAIN') ?: 'tiuoficial.com.br';
        $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? "https://" : "http://";
        return $protocol . $currentHost;
    }
    return get_store_url($store);
}

/**
 * Atualiza a URL da loja na sessão
 * Deve ser chamada após salvar alterações de domínio
 * 
 * @param array $store Dados atualizados da loja
 */
function update_session_store_url($store): void {
    $_SESSION['store_url'] = get_store_url($store);
    $_SESSION['current_store'] = $store;
}
