<?php

if (file_exists('../conexao/conexao.php')) {
    include('../conexao/conexao.php');
}

class Metas
{
    private $mysqlConnection;

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

    public function listarMetas($id = '', $sql = '')
    {
        // Consulta SQL padrão para buscar todas as filiais
        $sql = "SELECT * FROM tipos_meta WHERE 1=1 $sql";

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

        // Condicional para verificar se os parâmetros foram passados e construir a query e os parâmetros adequados
        if (!empty($id)) {
            $sql .= " AND tipos_meta.id = ?";
            $params[] = $id;
            $types .= 'i';  // Tipo 'i' para integer
        }

        // Prepara a consulta
        $stmt = $this->mysqlConnection->prepare($sql);
        if (!$stmt) {
            die('Erro na preparação da consulta MySQL: ' . $this->mysqlConnection->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);
        }

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

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

        return $tiposMetas;
    }

    public function addNovaMeta($mysqlConnection)
    {

        require_once '../../conexao/logs.php';

        if ($_SERVER['REQUEST_METHOD'] === 'POST') {
            if (isset($_POST['nome_meta']) && isset($_POST['observacao']) && isset($_POST['situacao'])) {

                $nome_meta   = $mysqlConnection->real_escape_string($_POST['nome_meta']);
                $observacao  = $mysqlConnection->real_escape_string($_POST['observacao']);
                $situacao    = $mysqlConnection->real_escape_string($_POST['situacao']);
                $nome_valores = $mysqlConnection->real_escape_string($_POST['nome_valores']);

                $query = "INSERT INTO tipos_meta (nome_meta, observacao, situacao, nome_valores) 
                      VALUES (?, ?, ?, ?)";
                $stmt = $mysqlConnection->prepare($query);

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

                $stmt->bind_param("ssss", $nome_meta, $observacao, $situacao, $nome_valores);

                if ($stmt->execute()) {
                    $_SESSION['message'] = 'Meta adicionada com sucesso!';

                    // 🔹 Pega o ID da nova meta
                    $next_id = $mysqlConnection->insert_id;

                    // 🔹 Registra o log somente aqui
                    if (isset($_SESSION['CodUsuario'], $_SESSION['NomeUsuario'])) {
                        $dados_depois = [
                            'nome_meta'   => $nome_meta,
                            'observacao'  => $observacao,
                            'situacao'    => $situacao,
                            'nome_valores' => $nome_valores
                        ];

                        registrarLogCriacaoDetalhado(
                            25,
                            $_SESSION['CodUsuario'],
                            $_SESSION['NomeUsuario'],
                            json_encode($dados_depois),
                            $next_id
                        );
                    }
                } else {
                    $_SESSION['message'] = 'Erro ao adicionar meta: ' . $stmt->error;
                }

                $stmt->close();
            } else {
                $_SESSION['message'] = 'Os campos nome_meta, observacao e situacao são obrigatórios.';
            }

            header('Location: listagem-metas.php?status=sucesso&acao=criar');
            exit();
        }
    }


    public function updateMeta($mysqlConnection, $id_tipo_meta)
    {
        require_once '../../conexao/logs.php';

        // Verifica se os dados foram enviados via POST
        if ($_SERVER['REQUEST_METHOD'] === 'POST') {

            // Verifica se os campos necessários estão presentes
            if (isset($_POST['nome_meta'], $_POST['observacao'], $_POST['situacao'], $_POST['nome_valores'])) {

                // Escapa e atribui os valores do POST (dados novos)
                $nome_meta    = $mysqlConnection->real_escape_string($_POST['nome_meta']);
                $observacao   = $mysqlConnection->real_escape_string($_POST['observacao']);
                $situacao     = $mysqlConnection->real_escape_string($_POST['situacao']);
                $nome_valores = $mysqlConnection->real_escape_string($_POST['nome_valores']);

                // 🔹 Buscar dados atuais antes da atualização
                $queryAntes = "SELECT nome_meta, observacao, situacao, nome_valores FROM tipos_meta WHERE id = ?";
                $stmtAntes = $mysqlConnection->prepare($queryAntes);
                $stmtAntes->bind_param("i", $id_tipo_meta);
                $stmtAntes->execute();
                $resultAntes = $stmtAntes->get_result();
                $dados_antes = $resultAntes->fetch_assoc();
                $stmtAntes->close();

                // Prepara a consulta SQL de atualização
                $queryUpdate = "UPDATE tipos_meta SET nome_meta = ?, observacao = ?, situacao = ?, nome_valores = ? WHERE id = ?";
                $stmtUpdate = $mysqlConnection->prepare($queryUpdate);
                if (!$stmtUpdate) {
                    die('Erro na preparação da consulta MySQL: ' . $mysqlConnection->error);
                }

                // Vincula os parâmetros e executa
                $stmtUpdate->bind_param("ssssi", $nome_meta, $observacao, $situacao, $nome_valores, $id_tipo_meta);
                if ($stmtUpdate->execute()) {
                    $_SESSION['message'] = 'Meta atualizada com sucesso!';

                    // 🔹 Registrar log inteligente
                    if (isset($_SESSION['CodUsuario'], $_SESSION['NomeUsuario'])) {
                        $dados_depois = [
                            'nome_meta'    => $nome_meta,
                            'observacao'   => $observacao,
                            'situacao'     => $situacao,
                            'nome_valores' => $nome_valores
                        ];

                        registrarLogAtualizacaoInteligente(
                            25,
                            $_SESSION['CodUsuario'],
                            $_SESSION['NomeUsuario'],
                            $dados_antes,
                            $dados_depois,
                            $id_tipo_meta
                        );
                    }
                } else {
                    $_SESSION['message'] = 'Erro ao atualizar meta: ' . $stmtUpdate->error;
                }

                $stmtUpdate->close();
            } else {
                $_SESSION['message'] = 'Todos os campos (nome_meta, observacao, situacao, nome_valores) são obrigatórios.';
            }

            // Redireciona para a listagem de metas
            header('Location: listagem-metas.php?status=sucesso&acao=atualizar');
            exit();
        }
    }


    public function desativaMeta($mysqlConnection)
    {
        // Verifica se o ID foi enviado via GET
        if (isset($_GET['id'])) {

            // Escapa o valor do GET
            $id_meta = $mysqlConnection->real_escape_string($_GET['id']);

            // Prepara a consulta SQL de exclusão
            $query = "DELETE FROM tipos_meta WHERE id = ?";

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

            // Vincula o parâmetro
            $stmt->bind_param("i", $id_meta);

            // Executa a consulta
            if ($stmt->execute()) {

                // 🔹 Pega o ID da nova meta
                $next_id = $mysqlConnection->insert_id;

                // 🔹 Registra o log somente aqui
                if (isset($_SESSION['CodUsuario'], $_SESSION['NomeUsuario'])) {
                    $dados_antes = [
                        'id_meta'   => $id_meta
                    ];

                    registrarLogExclusaoDetalhado(
                        25,
                        $_SESSION['CodUsuario'],
                        $_SESSION['NomeUsuario'],
                        json_encode($dados_antes),
                        $next_id
                    );
                }

                // Redireciona com status e ação
                header("Location: listagem-metas.php?status=sucesso&acao=excluir");
                exit();
            } else {
                header("Location: listagem-metas.php?status=erro&acao=excluir&msg=" . urlencode($stmt->error));
                exit();
            }

            // Fecha a declaração
            $stmt->close();
        }
    }


    /////////////////// DEFINE (CADASTRA) UMA META PARA QUINZENA OU MÊS //////////////////

    public function DefineMeta($mysqlConnection)
    {
        if ($_SERVER['REQUEST_METHOD'] === 'POST') {
            // Recebe os dados do formulário
            $codigo_filial = (int)$_POST['codigo_filial'];
            $codigos_meta = isset($_POST['codigo_meta']) && !empty($_POST['codigo_meta'])
                ? (is_array($_POST['codigo_meta']) ? $_POST['codigo_meta'] : explode(',', $_POST['codigo_meta']))
                : null;
            $tipo_meta = (string)$_POST['tipo_meta'];
            $comisao = $_POST['valor_comissao'];
            $ano = (int)$_POST['ano'];
            $meses = is_array($_POST['meses']) ? $_POST['meses'] : explode(',', $_POST['meses']);
            $valor_meta = isset($_POST['valor_meta']) ? (float)str_replace(['.', ','], ['', '.'], $_POST['valor_meta']) : 0.0;
            $valor_meta_2 = isset($_POST['valor_meta_2']) ? (float)str_replace(['.', ','], ['', '.'], $_POST['valor_meta_2']) : 0.0;

            // Garante que os vendedores sejam tratados como um array de inteiros
            //print_r($_POST);

            // Captura os vendedores e separa a string em um array
            //$vendedores_selecionados = isset($_POST['vendedor']) && is_array($_POST['vendedor']) ? array_unique(array_map('intval', explode(',', $_POST['vendedor'][0]))) : [];
            $visitadores_selecionados = isset($_POST['visitador'])
                ? (is_array($_POST['visitador'])
                    ? array_unique(array_map('intval', $_POST['visitador'])) // Se já for um array, mapeia para inteiros e remove duplicatas
                    : array_unique(array_map('intval', explode(',', $_POST['visitador']))) // Se for uma string separada por vírgulas, converte para array e mapeia
                )
                : [];

            $vendedores_selecionados = isset($_POST['vendedor'])
                ? (is_array($_POST['vendedor'])
                    ? array_unique(array_map('intval', $_POST['vendedor']))
                    : array_unique(array_map('intval', explode(',', $_POST['vendedor'])))
                )
                : [];


            // Inicia a transação
            $mysqlConnection->begin_transaction();
            $duplicataEncontrada = false;
            $erroExecucao = false;

            try {
                if ($tipo_meta !== '4') {
                    // Prepara a consulta para checar duplicatas
                    $checkQuery = "SELECT COUNT(*) AS total 
                           FROM define_metas 
                           WHERE codigo_filial = ? AND codigo_meta = ? AND ano = ? AND mes = ? AND codigo_vendedor = ?";
                    $checkStmt = $mysqlConnection->prepare($checkQuery);

                    // Prepara a consulta para inserção
                    $insertQuery = "INSERT INTO define_metas (codigo_filial, tipo_meta, codigo_meta, ano, valor_meta, mes, valor_meta_2, codigo_vendedor) 
                            VALUES (?, ?, ?, ?, ?, ?, ?, ?)";
                    $insertStmt = $mysqlConnection->prepare($insertQuery);

                    // Itera por todos os vendedores, metas e meses
                    foreach ($vendedores_selecionados as $codigo_vendedor) {
                        foreach ($codigos_meta as $codigo_meta) {
                            foreach ($meses as $mes) {
                                // Checa duplicata
                                $checkStmt->bind_param("iiiii", $codigo_filial, $codigo_meta, $ano, $mes, $codigo_vendedor);
                                $checkStmt->execute();
                                $checkResult = $checkStmt->get_result();
                                $row = $checkResult->fetch_assoc();

                                if ($row['total'] > 0) {
                                    $duplicataEncontrada = true;
                                    continue; // Pula a inserção se duplicata encontrada
                                }

                                // Insere a meta se não houver duplicata
                                $insertStmt->bind_param("isiididi", $codigo_filial, $tipo_meta, $codigo_meta, $ano, $valor_meta, $mes, $valor_meta_2, $codigo_vendedor);
                                if (!$insertStmt->execute()) {
                                    $erroExecucao = true;
                                    throw new Exception('Erro ao inserir meta: ' . $insertStmt->error);
                                }
                            }
                        }
                    }
                } elseif ($tipo_meta == '4') {
                    $checkQuery = "SELECT COUNT(*) AS total 
                   FROM define_metas 
                   WHERE codigo_filial = ? AND ano = ? AND mes = ? AND codigo_visitador = ?";
                    $checkStmt = $mysqlConnection->prepare($checkQuery);

                    // Prepara a consulta para inserção com valor padrão 0 para 'codigo_meta' e 'codigo_vendedor'
                    $insertQuery = "INSERT INTO define_metas (codigo_meta, codigo_filial, tipo_meta, ano, valor_meta, mes, valor_meta_2, codigo_vendedor, codigo_visitador,percentual) 
                    VALUES (0, ?, ?, ?, ?, ?, ?, 0, ?, ?)";
                    $insertStmt = $mysqlConnection->prepare($insertQuery);

                    // Itera por todos os vendedores, metas e meses
                    foreach ($visitadores_selecionados as $codigo_visitador) {
                        foreach ($meses as $mes) {
                            // Checa duplicata
                            $checkStmt->bind_param("iiii", $codigo_filial, $ano, $mes, $codigo_visitador);
                            $checkStmt->execute();
                            $checkResult = $checkStmt->get_result();
                            $row = $checkResult->fetch_assoc();

                            if ($row['total'] > 0) {
                                $duplicataEncontrada = true;
                                continue; // Pula a inserção se duplicata encontrada
                            }

                            // Insere a meta se não houver duplicata
                            $insertStmt->bind_param("iiiiddss", $codigo_filial, $tipo_meta, $ano, $valor_meta, $mes, $valor_meta_2, $codigo_visitador, $comisao);
                            if (!$insertStmt->execute()) {
                                $erroExecucao = true;
                                throw new Exception('Erro ao inserir meta: ' . $insertStmt->error);
                            }
                        }
                    }
                }

                // Finaliza a transação
                if ($erroExecucao) {
                    $mysqlConnection->rollback(); // Reverte transações se houver erro
                    echo 'Erro ao adicionar algumas metas. A transação foi revertida.';
                } else {
                    $mysqlConnection->commit(); // Confirma as transações se tudo for bem-sucedido
                    if ($tipo_meta == '4') {
                        if ($duplicataEncontrada) {
                            echo "<script>
                    alert('Algumas combinações de mês/visitador/meta já existem. Verifique os registros.');
                    window.location.href = 'lista_metas_definidas.php?ano=$ano&filial=$codigo_filial&tipo_meta=$tipo_meta';
                    </script>";
                        } else {
                            $_SESSION['message'] = 'Meta adicionada com sucesso para os meses, visitadores e metas selecionados!';
                            header("Location: lista_metas_definidas.php?ano=$ano&filial=$codigo_filial&tipo_meta=$tipo_meta");
                        }
                    } else {
                        // Redirecionamento e feedback para o usuário
                        if ($duplicataEncontrada) {
                            echo "<script>
                    alert('Algumas combinações de mês/vendedor/meta já existem. Verifique os registros.');
                    window.location.href = 'lista_metas_definidas.php?ano=$ano&filial=$codigo_filial&tipo_meta=$tipo_meta';
                    </script>";
                        } else {
                            $_SESSION['message'] = 'Meta adicionada com sucesso para os meses, vendedores e metas selecionados!';
                            header("Location: lista_metas_definidas.php?ano=$ano&filial=$codigo_filial&tipo_meta=$tipo_meta");
                        }
                    }
                }
            } catch (Exception $e) {
                $mysqlConnection->rollback(); // Reverte transação em caso de exceção
                echo 'Erro ao adicionar metas: ' . $e->getMessage();
            } finally {
                // Fecha as declarações
                $checkStmt->close();
                $insertStmt->close();
            }
        }
    }

    public function UpdateDefineMeta($mysqlConnection)
    {
        if (session_status() == PHP_SESSION_NONE) {
            session_start();
        }

        if ($_SERVER['REQUEST_METHOD'] === 'POST') {

            $ids = isset($_POST['ids']) ? $_POST['ids'] : null;
            $codigo_filial = isset($_POST['codigo_filial']) ? (int)$_POST['codigo_filial'] : 0;
            $codigo_meta = isset($_POST['codigo_meta']) ? (int)$_POST['codigo_meta'] : 0;
            $tipo_meta = isset($_POST['tipo_meta']) ? mysqli_real_escape_string($mysqlConnection, $_POST['tipo_meta']) : '';
            $ano = isset($_POST['ano']) ? (int)$_POST['ano'] : 0;
            $mes = isset($_POST['mes']) ? (int)$_POST['mes'] : 0;
            $comisao = $_POST['valor_comissao'] ?? null;
            $comisao = isset($comisao) && is_numeric($comisao) ? $comisao : 0;

            $valor_meta = isset($_POST['valor_meta']) ? floatval(str_replace(['.', ','], ['', '.'], $_POST['valor_meta'])) : 0.0;
            $valor_meta_2 = isset($_POST['valor_meta_2']) ? floatval(str_replace(['.', ','], ['', '.'], $_POST['valor_meta_2'])) : 0.0;

            $codigo_vendedor = isset($_POST['codigo_vendedor']) ? (int)$_POST['codigo_vendedor'] : 0;
            $codigo_visitador = isset($_POST['codigo_visitador']) ? (int)$_POST['codigo_visitador'] : 0;

            if (!empty($ids)) {
                $idsList = implode(',', array_map('intval', explode(',', $ids)));
                $deleteQuery = "DELETE FROM define_metas WHERE id IN ($idsList)";
                if (!$mysqlConnection->query($deleteQuery)) {
                    echo 'Erro ao excluir registros: ' . $mysqlConnection->error . "<br>";
                    return;
                }
            }
            if ($tipo_meta !== '4') {
                $query = "INSERT INTO define_metas (codigo_filial, tipo_meta, codigo_meta, ano, mes, valor_meta, valor_meta_2, codigo_vendedor) 
                  VALUES ('$codigo_filial', '$tipo_meta', '$codigo_meta', '$ano', '$mes', '$valor_meta', '$valor_meta_2', '$codigo_vendedor')";

                if (!$mysqlConnection->query($query)) {
                    echo 'Erro ao inserir nova meta para o vendedor ' . $codigo_vendedor . ' no mês ' . $mes . ': ' . $mysqlConnection->error . "<br>";
                    return;
                }

                $_SESSION['message'] = 'Meta atualizada e nova meta adicionada com sucesso!';

                header("Location: lista_metas_definidas.php?filial={$codigo_filial}&ano={$ano}&mes={$mes}&tipo_meta={$tipo_meta}&codigo_vendedor=Todos&form_submit=1");
                exit();
            } else {
                if ($codigo_visitador !== 0) {
                    $query = "INSERT INTO define_metas (codigo_filial, tipo_meta, codigo_meta, ano, mes, valor_meta, valor_meta_2, codigo_vendedor,codigo_visitador,percentual) 
                  VALUES ('$codigo_filial', '$tipo_meta', 0, '$ano', '$mes', '$valor_meta', '$valor_meta_2', 0,$codigo_visitador,$comisao)";

                    if (!$mysqlConnection->query($query)) {
                        echo 'Erro ao inserir nova meta para o visitador ' . $codigo_visitador . ' no mês ' . $mes . ': ' . $mysqlConnection->error . "<br>";
                        return;
                    }

                    $_SESSION['message'] = 'Meta atualizada e nova meta adicionada com sucesso!';

                    header("Location: lista_metas_definidas.php?filial={$codigo_filial}&ano={$ano}&mes={$mes}&tipo_meta={$tipo_meta}&visitador=Todos&form_submit=1");
                    exit();
                }
            }
        }
    }

    public function deletaMetaDefinida($mysqlConnection)
    {

        if (isset($_GET['id'])) {
            // Verifica se é um array; se não, converte para um array
            $ids = $_GET['id'] ?? ''; // Garante que a variável sempre exista
            if (!is_array($ids)) {
                $ids = explode(',', $ids); // Se for uma string, separa pelos delimitadores
            }
            $ids = array_filter($ids, 'is_numeric'); // Filtra apenas valores numéricos
            $ids = array_map('intval', $ids); // Converte para inteiros

            if (!empty($ids)) {
                $placeholders = implode(',', array_fill(0, count($ids), '?'));
                $deleteQuery = "DELETE FROM define_metas WHERE id IN ($placeholders)";
                $deleteStmt = $mysqlConnection->prepare($deleteQuery);

                if (!$deleteStmt) {
                    die('Erro na preparação da consulta de exclusão: ' . $mysqlConnection->error);
                }

                // Define o tipo de cada parâmetro como inteiro
                $types = str_repeat('i', count($ids));

                // Usa o operador de descompactação `...` para passar os parâmetros individualmente
                $deleteStmt->bind_param($types, ...array_values($ids));

                if (!$deleteStmt->execute()) {
                    $_SESSION['message'] = 'Erro ao excluir as metas: ' . $deleteStmt->error;
                } else {
                    $_SESSION['message'] = 'Metas excluídas com sucesso!';
                }

                $deleteStmt->close();

                // Remove o parâmetro 'id' dos parâmetros de consulta originais
                $queryParams = $_GET;
                unset($queryParams['id']);

                // Reconstrói a query string com os parâmetros restantes
                $queryString = http_build_query($queryParams);

                // Redireciona com os parâmetros originais
                echo '<script type="text/javascript">window.location.href="lista_metas_definidas.php?' . $queryString . '";</script>';
                exit();
            }
        }
    }

    ///////////////// LISTA DE METAS E VALORES DEFINIDOS //////////////////

    public function listarMetasDefinidas($id = '', $filial = 'Todos', $ano = '', $mes = '', $sqlFiltro = '')
    {
        if ($filial !== 'Todos') {
            $filial = $filial ? implode(',', array_map(function ($item) {
                return "'" . addslashes(trim($item)) . "'";
            }, explode(',', $filial))) : 'NULL';
        }
        // Inicia a query base com GROUP BY e SUM
        $sql = "SELECT 
            GROUP_CONCAT(id) AS ids, 
            codigo_filial, 
            codigo_meta, 
            ano, 
            mes, 
            tipo_meta,
            codigo_vendedor,
            codigo_visitador,
            percentual,
            SUM(valor_meta) AS valor_meta,
            SUM(CASE WHEN valor_meta_2 <> 0 THEN valor_meta_2 ELSE 0 END) AS valor_meta_2
        FROM define_metas 
        WHERE 1=1 $sqlFiltro";

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

        // Condicional para verificar se o parâmetro único ou múltiplos IDs foram passados
        if (!empty($id)) {
            // Explode a string de IDs em um array
            $idsArray = explode(',', $id);

            // Gera os placeholders para a cláusula IN (um "?" para cada ID)
            $placeholders = implode(',', array_fill(0, count($idsArray), '?'));

            // Adiciona a condição na query
            $sql .= " AND define_metas.id IN ($placeholders)";

            // Armazena os IDs no array de parâmetros
            foreach ($idsArray as $idItem) {
                $params[] = $idItem;
                $types .= 'i';  // Tipo 'i' para integer (os IDs são números inteiros)
            }
        }

        if (!empty($filial) && $filial !== 'Todos') {
            $sql .= " AND define_metas.codigo_filial IN ($filial)";
            // $params[] = $filial;
            // $types .= 'i';  // Tipo 'i' para integer
        }

        if (!empty($ano) && $ano !== 'Todos') {
            $sql .= " AND define_metas.ano = ?";
            $params[] = $ano;
            $types .= 'i';  // Tipo 'i' para integer
        }

        if (!empty($mes) && $mes !== 'Todos') {
            $sql .= " AND define_metas.mes = ?";
            $params[] = $mes;
            $types .= 'i';  // Tipo 'i' para integer
        }

        // Agrupando os resultados
        $sql .= " GROUP BY codigo_filial, codigo_meta, ano, mes, tipo_meta, codigo_vendedor,codigo_visitador,percentual
";

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

        // Se houver parâmetros, faz 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);
        }

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

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

        return $metasDefinidas;
    }

    public function listarValoresMetas($id = '', $ids = '', $sqlFiltro = '')
    {
        // Inicia a query base com GROUP BY para agregar por ano e mês
        $sql = "SELECT 
                define_metas.codigo_filial, 
                define_metas.tipo_meta, 
                define_metas.codigo_meta, 
                define_metas.ano, 
                define_metas.mes, 
                SUM(define_metas.valor_meta) AS valor_meta,
                define_metas.codigo_vendedor, 
                define_metas.periodo 
            ";

        // Completa o SQL com a tabela e possíveis filtros
        $sql .= " FROM define_metas WHERE 1=1 $sqlFiltro";

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

        // Condicional para verificar se o parâmetro único foi passado
        if (!empty($id)) {
            $sql .= " AND define_metas.id = ?";
            $params[] = $id;
            $types .= 'i';  // Tipo 'i' para integer
        }

        // Condicional para verificar se múltiplos IDs foram passados
        if (!empty($ids)) {
            $sql .= " AND define_metas.id IN ($ids)";
        }

        // Adiciona o GROUP BY para agregar resultados por período
        $sql .= " GROUP BY define_metas.ano, define_metas.mes, define_metas.codigo_filial, 
              define_metas.tipo_meta, define_metas.codigo_meta, define_metas.codigo_vendedor, define_metas.periodo";

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

        // Se houver parâmetros, faz 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);
        }

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

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

        return $metasDefinidas;
    }

    ////////////////////////////////////////////////////////////////////

    function get_periodo()
    {
        global $connectionmysql;
        $sql_preferencia = "SELECT c.tipo_meta, valor1 FROM configuracoes c WHERE c.tipo_meta = 'Período'";

        $result = $connectionmysql->query($sql_preferencia);

        if ($result && $result->num_rows > 0) {
            $row = $result->fetch_assoc();
            return $row['valor1'];
        }

        return null;
    }
}
