<?php

namespace Gestoreasy\Core\Database;

use PDO;
use Closure;

/**
 * Profiler de queries para análise de performance
 */
class QueryProfiler {
    /**
     * Executa uma query e registra o tempo de execução
     */
    public static function profile(PDO $pdo, string $sql, array $params = []): array {
        $start = microtime(true);
        $error = null;
        $result = null;

        try {
            $stmt = $pdo->prepare($sql);
            $stmt->execute($params);
            $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
        } catch (\Exception $e) {
            $error = $e->getMessage();
        }

        $duration = (microtime(true) - $start) * 1000; // em ms

        // Registrar no logger se habilitado
        if (QueryLogger::isEnabled()) {
            QueryLogger::log($sql, $params, $duration, $error);
        }

        return [
            'result' => $result,
            'duration_ms' => round($duration, 2),
            'error' => $error,
            'row_count' => $result ? count($result) : 0,
        ];
    }

    /**
     * Executa uma função e mede o tempo total
     */
    public static function profileFunction(Closure $function): array {
        $start = microtime(true);
        $error = null;
        $result = null;

        try {
            $result = $function();
        } catch (\Exception $e) {
            $error = $e->getMessage();
        }

        $duration = (microtime(true) - $start) * 1000;

        return [
            'result' => $result,
            'duration_ms' => round($duration, 2),
            'error' => $error,
        ];
    }

    /**
     * Analisa um plano de execução (EXPLAIN)
     */
    public static function explain(PDO $pdo, string $sql, array $params = []): array {
        $explainSql = "EXPLAIN {$sql}";
        $stmt = $pdo->prepare($explainSql);
        $stmt->execute($params);
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }

    /**
     * Verifica se uma query usa índices
     */
    public static function checkIndexUsage(PDO $pdo, string $sql, array $params = []): bool {
        $explain = self::explain($pdo, $sql, $params);
        
        foreach ($explain as $row) {
            $key = $row['key'] ?? $row['KEY'] ?? null;
            if ($key !== null && $key !== '') {
                return true; // Query usa índice
            }
        }
        
        return false; // Query não usa índices (full table scan)
    }
}

