<?php

class QueryLogs
{
    private $connectionmysql;

    public function __construct($connectionmysql)
    {
        $this->connectionmysql = $connectionmysql;
    }

    public function getTiposLog()
    {
        $sql = "SELECT id, nome FROM tipos_log ORDER BY nome";

        $stmt = $this->connectionmysql->prepare($sql);
        if (!$stmt) {
            die('Erro na preparação da consulta MySQL: ' . $this->connectionmysql->error);
        }

        if (!$stmt->execute()) {
            die('Erro na execução da consulta MySQL: ' . $stmt->error);
        }

        $result = $stmt->get_result();
        if (!$result) {
            die('Erro ao obter resultado MySQL: ' . $stmt->error);
        }

        $tipos = [];
        while ($row = $result->fetch_assoc()) {
            $tipos[] = $row;
        }

        $stmt->close();
        return $tipos;
    }

    public function getModulos()
    {
        $sql = "SELECT id_modulo as ID,  CONCAT(modulo, ' - ', descricao) AS NOME  FROM modulo ORDER BY modulo";

        $stmt = $this->connectionmysql->prepare($sql);
        if (!$stmt) {
            die('Erro na preparação da consulta MySQL: ' . $this->connectionmysql->error);
        }

        if (!$stmt->execute()) {
            die('Erro na execução da consulta MySQL: ' . $stmt->error);
        }

        $result = $stmt->get_result();
        if (!$result) {
            die('Erro ao obter resultado MySQL: ' . $stmt->error);
        }

        $modulos = [];
        while ($row = $result->fetch_assoc()) {
            $modulos[] = $row;
        }

        $stmt->close();
        return $modulos;
    }

    public function getUsuariosUnicos()
    {
        $sql = "SELECT DISTINCT id_usuario, nome_usuario FROM logs ORDER BY nome_usuario";

        $stmt = $this->connectionmysql->prepare($sql);
        if (!$stmt) {
            die('Erro na preparação da consulta MySQL: ' . $this->connectionmysql->error);
        }

        if (!$stmt->execute()) {
            die('Erro na execução da consulta MySQL: ' . $stmt->error);
        }

        $result = $stmt->get_result();
        if (!$result) {
            die('Erro ao obter resultado MySQL: ' . $stmt->error);
        }

        $usuarios = [];
        while ($row = $result->fetch_assoc()) {
            $usuarios[] = $row;
        }

        $stmt->close();
        return $usuarios;
    }


    public function getLogs($filtros = [])
    {

        // Consulta SQL base
        $sql = "SELECT l.*, m.modulo, m.id_modulo, m.descricao as descricao_modulo, tl.nome as tipo_log 
                FROM logs l 
                LEFT JOIN modulo m ON l.modulo = m.id_modulo 
                LEFT JOIN tipos_log tl ON l.id_tipo_log = tl.id 
                WHERE 1=1";

        // Armazena os parâmetros e seus tipos para o bind
        $params = [];
        $types = '';

        // Adiciona os filtros à query
        if (!empty($filtros['data_inicial'])) {
            $sql .= " AND DATE(l.data_criacao) >= ?";
            $params[] = $filtros['data_inicial'];
            $types .= 's';
        }

        if (!empty($filtros['data_final'])) {
            $sql .= " AND DATE(l.data_criacao) <= ?";
            $params[] = $filtros['data_final'];
            $types .= 's';
        }

        if (!empty($filtros['tipo_log'])) {
            $sql .= " AND l.id_tipo_log = ?";
            $params[] = $filtros['tipo_log'];
            $types .= 'i';
        }

        if (!empty($filtros['modulo'])  && $filtros['modulo'] !== 'NULL') {
            $sql .= " AND l.modulo IN (" . $filtros['modulo'] . ")";
            //$params[] = $filtros['modulo'];
            //$types .= 'i';
        }

        if (!empty($filtros['usuario'])) {
            $sql .= " AND l.id_usuario = ?";
            $params[] = $filtros['usuario'];
            $types .= 's';
        }

        // Ordenação
        $sql .= " ORDER BY l.data_criacao DESC";

        // Prepara a consulta
        $stmt = $this->connectionmysql->prepare($sql);
        if (!$stmt) {
            die('Erro na preparação da consulta MySQL: ' . $this->connectionmysql->error);
        }

        // Se houver parâmetros, fazemos o bind deles
        if (!empty($params)) {
            $stmt->bind_param($types, ...$params);
        }

        // Executa a consulta
        if (!$stmt->execute()) {
            die('Erro na execução da consulta MySQL: ' . $stmt->error);
        }

        // Obtém o resultado
        $result = $stmt->get_result();
        if (!$result) {
            die('Erro ao obter resultado MySQL: ' . $stmt->error);
        }

        $logs = [];
        while ($row = $result->fetch_assoc()) {
            $logs[] = $row;
        }

        // Fecha a consulta
        $stmt->close();

        return $logs;
    }

    public function LogsAcessados($filtros = [])
    {
        // Consulta SQL corrigida: apenas módulos com descrição válida
        $sql = "SELECT 
                l.modulo,
                m.descricao AS descricao_modulo,
                COUNT(*) AS total_acessos,
                MAX(l.data_criacao) AS ultima_data_acesso
            FROM logs l
            INNER JOIN modulo m ON l.modulo = m.id_modulo
            WHERE 1=1";

        // Parâmetros e tipos
        $params = [];
        $types = '';

        // Filtros
        if (!empty($filtros['data_inicial'])) {
            $sql .= " AND DATE(l.data_criacao) >= ?";
            $params[] = $filtros['data_inicial'];
            $types .= 's';
        }

        if (!empty($filtros['data_final'])) {
            $sql .= " AND DATE(l.data_criacao) <= ?";
            $params[] = $filtros['data_final'];
            $types .= 's';
        }

        if (!empty($filtros['modulo']) && $filtros['modulo'] !== 'NULL') {
            $sql .= " AND l.modulo IN (" . $filtros['modulo'] . ")";
        }

        // Agrupamento
        $sql .= " GROUP BY l.modulo, m.descricao";
        $sql .= " ORDER BY ultima_data_acesso DESC";

        // Prepara a consulta
        $stmt = $this->connectionmysql->prepare($sql);
        if (!$stmt) {
            die('Erro na preparação da consulta MySQL: ' . $this->connectionmysql->error);
        }

        // Bind dos parâmetros
        if (!empty($params)) {
            $stmt->bind_param($types, ...$params);
        }

        // Executa a consulta
        if (!$stmt->execute()) {
            die('Erro na execução da consulta MySQL: ' . $stmt->error);
        }

        // Pega os resultados
        $result = $stmt->get_result();
        if (!$result) {
            die('Erro ao obter resultado MySQL: ' . $stmt->error);
        }

        $logs = [];
        while ($row = $result->fetch_assoc()) {
            $logs[] = $row;
        }

        $stmt->close();

        return $logs;
    }


    public function AcessosPorUsuario($modulo, $data_inicial = null, $data_final = null)
    {
        // Garante que é string simples, não array
        if (is_array($modulo)) {
            $modulo = reset($modulo); // Pega o primeiro valor
        }

        $sql = "SELECT l.nome_usuario, COUNT(*) AS total_acessos
            FROM logs l
            WHERE l.modulo = ?";

        $params = [$modulo];
        $types = 's';

        if ($data_inicial) {
            $sql .= " AND DATE(l.data_criacao) >= ?";
            $params[] = $data_inicial;
            $types .= 's';
        }

        if ($data_final) {
            $sql .= " AND DATE(l.data_criacao) <= ?";
            $params[] = $data_final;
            $types .= 's';
        }

        $sql .= " GROUP BY l.nome_usuario ORDER BY total_acessos DESC";

        $stmt = $this->connectionmysql->prepare($sql);
        if (!$stmt) {
            die('Erro na preparação da consulta: ' . $this->connectionmysql->error);
        }

        if (!empty($params)) {
            $stmt->bind_param($types, ...$params);
        }

        if (!$stmt->execute()) {
            die('Erro na execução da consulta MySQL: ' . $stmt->error);
        }

        $result = $stmt->get_result();
        if (!$result) {
            die('Erro ao obter resultado MySQL: ' . $stmt->error);
        }

        $dados = [];
        while ($row = $result->fetch_assoc()) {
            $dados[] = $row;
        }

        $stmt->close();
        return $dados;
    }
}
