<?php
require '../../conexao/conexao.php';
require '../../conexao/logs.php';
require '../../conexao/acesso.php';

class CunsultasPainelMetas
{
    private $connectionmysql;
    private $connection;

    public function __construct()
    {
        global $connectionmysql, $connection; // Acesso às conexões globais
        $this->connectionmysql = $connectionmysql;
        $this->connection = $connection;
    }
    public function get_allvendedores($codigo_filial = null, $vendedor = null)
    {

        $query_vendedor_filial = " SELECT 
              FU.CODIGO AS COD_VENDEDOR ,
              FU.NOMEFUNCIONARIO AS NOME,
              FU.CODIGO_EMPRESA AS ID_REFERENCIA,
              FU.DATAADMISSAO AS DATA_ADMISSAO
          FROM FUNCIONARIO FU
          INNER JOIN FUNCIONARIO_FUNCAO FF ON FU.CODIGO_FUNCIONARIO_FUNCAO = FF.CODIGO
          INNER JOIN FUNCIONARIO_DEPTO FD ON FU.CODIGO_FUNCIONARIO_DEPTO = FD.CODIGO
          WHERE FU.CODIGO <> 0
         ";

        if (!empty($codigo_filial) && $codigo_filial !== 'Todos' && $codigo_filial !== 'Selecione') {
            $query_vendedor_filial .= "  AND FU.CODIGO_EMPRESA IN ($codigo_filial)";
        }

        if (!empty($vendedor) && $vendedor !== 'Todos' && $vendedor !== 'Selecione') {
            $query_vendedor_filial .= "  AND FU.CODIGO IN ($vendedor)";
        }

        $query_vendedor_filial .= "  GROUP BY
              FU.CODIGO,
              FU.NOMEFUNCIONARIO,
              FU.CODIGO_EMPRESA,
              FU.DATAADMISSAO
          ORDER BY FU.NOMEFUNCIONARIO";

        $result_vendedor_filial = ibase_query($this->connection, $query_vendedor_filial);

        if (!$result_vendedor_filial) {
            die('Erro na consulta: ' . ibase_errmsg());
        }

        $vendedorlojas = [];

        while ($row = ibase_fetch_assoc($result_vendedor_filial)) {
            //$row['NOME'] = mb_convert_encoding($row['NOME'], 'UTF-8', 'ISO-8859-1');
            $vendedorlojas[] = $row;
            //$vendedorlojas[$row['COD_VENDEDOR']] = $row['NOME'];
        }

        // Retorna o array de vendedores
        return $vendedorlojas;
    }

    public function DefineMeta($codigo_filial = null, $codigo_meta = null, $tipo_meta = null, $comisao = null, $ano = null, $mes = null, $valor_meta = null, $valor_meta_2 = null, $codigo_vendedor = null, $codigo_visitador = null, $periodo = null, $semana = null, $registrar_log = true)
    {
        $duplicataEncontrada = false;
        $erroExecucao = false;

        try {
            if ($tipo_meta !== '4') {

                if ($periodo == 1) $valor_meta_2 = null;
                elseif ($periodo == 2) $valor_meta = null;

                // Consulta duplicata
                $checkQuery = "SELECT COUNT(*) AS total 
                           FROM define_metas 
                           WHERE codigo_filial = ? AND codigo_meta = ? AND ano = ? AND mes = ? AND codigo_vendedor = ? AND semana = ?";
                $checkStmt = $this->connectionmysql->prepare($checkQuery);
                $checkStmt->bind_param("iiiiii", $codigo_filial, $codigo_meta, $ano, $mes, $codigo_vendedor, $semana);
                $checkStmt->execute();
                $checkResult = $checkStmt->get_result();
                $row = $checkResult->fetch_assoc();

                if ($row['total'] < 1) {
                    // Inserção
                    $insertQuery = "INSERT INTO define_metas (codigo_filial, tipo_meta, codigo_meta, ano, valor_meta, mes, valor_meta_2, codigo_vendedor, semana) 
                                VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)";
                    $insertStmt = $this->connectionmysql->prepare($insertQuery);
                    $insertStmt->bind_param("isiididii", $codigo_filial, $tipo_meta, $codigo_meta, $ano, $valor_meta, $mes, $valor_meta_2, $codigo_vendedor, $semana);

                    if (!$insertStmt->execute()) throw new Exception('Erro ao inserir meta: ' . $insertStmt->error);

                    $next_id = $this->connectionmysql->insert_id;

                    if ($registrar_log && isset($_SESSION['CodUsuario'], $_SESSION['NomeUsuario'])) {
                        $dados_depois = [
                            'codigo_filial' => $codigo_filial,
                            'codigo_meta' => $codigo_meta,
                            'ano' => $ano,
                            'mes' => $mes,
                            'valor_meta' => $valor_meta,
                            'valor_meta_2' => $valor_meta_2,
                            'codigo_vendedor' => $codigo_vendedor,
                            'semana' => $semana
                        ];
                        registrarLogCriacaoDetalhado(30, $_SESSION['CodUsuario'], $_SESSION['NomeUsuario'], json_encode($dados_depois), $next_id);
                    }
                    
                    return $next_id; // Retorna o ID criado
                } else {
                    // Duplicata encontrada, não insere
                    return false;
                }

                // Este return nunca será alcançado, mas mantemos por segurança
                return false;

            } elseif ($tipo_meta == '4') {
                $checkQuery = "SELECT COUNT(*) AS total 
                           FROM define_metas 
                           WHERE codigo_filial = ? AND ano = ? AND mes = ? AND codigo_visitador = ? AND codigo_meta = ?";
                $checkStmt = $this->connectionmysql->prepare($checkQuery);
                $checkStmt->bind_param("iiiii", $codigo_filial, $ano, $mes, $codigo_visitador, $codigo_meta);
                $checkStmt->execute();
                $checkResult = $checkStmt->get_result();
                $row = $checkResult->fetch_assoc();

                if ($row['total'] < 1) {
                    $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, ?, ?)";
                    $insertStmt = $this->connectionmysql->prepare($insertQuery);
                    $insertStmt->bind_param("iiiididss", $codigo_meta, $codigo_filial, $tipo_meta, $ano, $valor_meta, $mes, $valor_meta_2, $codigo_visitador, $comisao);

                    if (!$insertStmt->execute()) throw new Exception('Erro ao inserir meta: ' . $insertStmt->error);

                    $next_id = $this->connectionmysql->insert_id;

                    if ($registrar_log && isset($_SESSION['CodUsuario'], $_SESSION['NomeUsuario'])) {
                        $dados_depois = [
                            'codigo_meta' => $codigo_meta,
                            'codigo_filial' => $codigo_filial,
                            'ano' => $ano,
                            'mes' => $mes,
                            'valor_meta' => $valor_meta,
                            'valor_meta_2' => $valor_meta_2,
                            'codigo_visitador' => $codigo_visitador,
                            'percentual' => $comisao
                        ];
                        registrarLogCriacaoDetalhado(30, $_SESSION['CodUsuario'], $_SESSION['NomeUsuario'], json_encode($dados_depois), $next_id);
                    }
                }

                return $next_id ?? false;
            }
        } catch (Exception $e) {
            $this->connectionmysql->rollback();
            echo 'Erro ao adicionar metas: ' . $e->getMessage();
            return false;
        } finally {
            if (isset($insertStmt)) $insertStmt->close();
            if (isset($checkStmt)) $checkStmt->close();
        }
    }

    public function VerificaDuplicata($codigo_filial, $codigo_meta, $tipo_meta, $ano, $mes, $codigo_vendedor = null, $semana = null)
    {
        try {
            if ($tipo_meta !== '4') {
                // Tipos 1, 2, 3 (vendedores/lojas)
                $query = "SELECT COUNT(*) AS total 
                          FROM define_metas 
                          WHERE codigo_filial = ? 
                            AND codigo_meta = ? 
                            AND ano = ? 
                            AND mes = ? 
                            AND codigo_vendedor = ? 
                            AND semana " . ($semana === null ? "IS NULL" : "= ?");

                $stmt = $this->connectionmysql->prepare($query);

                if ($semana === null) {
                    $stmt->bind_param("iiiii", $codigo_filial, $codigo_meta, $ano, $mes, $codigo_vendedor);
                } else {
                    $stmt->bind_param("iiiiii", $codigo_filial, $codigo_meta, $ano, $mes, $codigo_vendedor, $semana);
                }
            } else {
                // Tipo 4 (visitador)
                $query = "SELECT COUNT(*) AS total 
                          FROM define_metas 
                          WHERE codigo_filial = ? 
                            AND ano = ? 
                            AND mes = ? 
                            AND codigo_visitador = ? 
                            AND codigo_meta = ?";
                $stmt = $this->connectionmysql->prepare($query);
                $stmt->bind_param("iiiii", $codigo_filial, $ano, $mes, $codigo_vendedor, $codigo_meta);
            }

            $stmt->execute();
            $result = $stmt->get_result();
            $row = $result->fetch_assoc();
            $stmt->close();

            return ($row['total'] > 0); // true = já existe duplicata

        } catch (Exception $e) {
            throw new Exception("Erro ao verificar duplicata: " . $e->getMessage());
        }
    }


    public function UpdateDefineMeta($id, $tipo_meta, $valor_meta = null, $valor_meta_2 = null, $comissao = null, $periodo = null, $semana = null, $registrar_log = true)
    {
        try {
            // 1️⃣ Captura os dados antes da atualização
            $query_antes = "SELECT * FROM define_metas WHERE id = ?";
            $stmt_antes = $this->connectionmysql->prepare($query_antes);
            $stmt_antes->bind_param('i', $id);
            $stmt_antes->execute();
            $result_antes = $stmt_antes->get_result();
            $dados_antes = $result_antes->fetch_assoc();
            $stmt_antes->close();

            // 2️⃣ Executa a atualização
               if ($tipo_meta == '4') {
                if ($periodo == 1) {
                    $query = "UPDATE define_metas SET valor_meta = ?, percentual = ? WHERE id = ?";
                    $stmt = $this->connectionmysql->prepare($query);
                    $stmt->bind_param('ddi', $valor_meta, $comissao, $id);
                } elseif ($periodo == 2) {
                    $query = "UPDATE define_metas SET valor_meta_2 = ?, percentual = ? WHERE id = ?";
                    $stmt = $this->connectionmysql->prepare($query);
                    $stmt->bind_param('ddi', $valor_meta_2, $comissao, $id);
                } else {
                    $query = "UPDATE define_metas SET valor_meta = ?, valor_meta_2 = ?, percentual = ?, semana = ? WHERE id = ?";
                    $stmt = $this->connectionmysql->prepare($query);
                    $stmt->bind_param('dddii', $valor_meta, $valor_meta_2, $comissao, $semana, $id);
                }
            } else {
                $query = "UPDATE define_metas SET valor_meta = ?, valor_meta_2 = ? WHERE id = ?";
                $stmt = $this->connectionmysql->prepare($query);
                $stmt->bind_param('ddi', $valor_meta, $valor_meta_2, $id);
                 if ($periodo == 1) {
                    $query = "UPDATE define_metas SET valor_meta = ? WHERE id = ?";
                    $stmt = $this->connectionmysql->prepare($query);
                    $stmt->bind_param('di', $valor_meta, $id);
                } elseif ($periodo == 2) {
                    $query = "UPDATE define_metas SET valor_meta_2 = ? WHERE id = ?";
                    $stmt = $this->connectionmysql->prepare($query);
                    $stmt->bind_param('di', $valor_meta_2, $id);
                } else {
                    $query = "UPDATE define_metas SET valor_meta = ?, valor_meta_2 = ?, semana = ? WHERE id = ?";
                    $stmt = $this->connectionmysql->prepare($query);
                    $stmt->bind_param('ddii', $valor_meta, $valor_meta_2, $semana, $id);
                }
            }

            if (!$stmt->execute()) {
                throw new Exception('Erro ao atualizar a meta: ' . $stmt->error);
            }

            $stmt->close();

            // 3️⃣ Captura os dados depois da atualização
            $query_depois = "SELECT * FROM define_metas WHERE id = ?";
            $stmt_depois = $this->connectionmysql->prepare($query_depois);
            $stmt_depois->bind_param('i', $id);
            $stmt_depois->execute();
            $result_depois = $stmt_depois->get_result();
            $dados_depois = $result_depois->fetch_assoc();
            $stmt_depois->close();

            // 4️⃣ Registrar log de atualização apenas se solicitado
            if ($registrar_log && isset($_SESSION['CodUsuario'], $_SESSION['NomeUsuario'])) {
                registrarLogAtualizacaoInteligente(
                    29,                     // ID do módulo (corrigido para 73)
                    $_SESSION['CodUsuario'],
                    $_SESSION['NomeUsuario'],
                    $dados_antes,           // dados antes do update
                    $dados_depois,          // dados após o update
                    $id                     // ID do registro atualizado
                );
            }

            return [
                'id' => $id,
                'dados_antes' => $dados_antes,
                'dados_depois' => $dados_depois
            ];
        } catch (Exception $e) {
            echo 'Erro no UpdateDefineMeta: ' . $e->getMessage() . "<br>";
            return false;
        }
    }

    /**
     * Cria múltiplas metas com log consolidado
     */
    public function DefineMetaConsolidada($dados_metas, $tipo_meta, $ano, $mes, $periodo, $semana = null)
    {
        $ids_criados = [];
        $dados_consolidados = [];
        $registros_processados = []; // Controle de duplicatas
        
        // DEBUG: Log para rastrear processamento
        $debug_log = [];

        try {
            foreach ($dados_metas as $filial => $vendedores) {
                foreach ($vendedores as $cod_vendedor => $meses) {
                    foreach ($meses as $mes_atual => $tipos) {
                        $tipos_meta = [
                            '2' => ['valor1' => $tipos['manipulado1'] ?? null, 'valor2' => $tipos['manipulado2'] ?? null],
                            '1' => ['valor1' => $tipos['revenda1'] ?? null, 'valor2' => $tipos['revenda2'] ?? null],
                            '3' => ['valor1' => $tipos['marca_propria1'] ?? null, 'valor2' => $tipos['marca_propria2'] ?? null],
                        ];

                        foreach ($tipos_meta as $codigo_meta => $valores) {
                            // Verifica se há valores para processar
                            if (empty($valores['valor1']) && empty($valores['valor2'])) {
                                continue;
                            }

                            // Cria chave única para evitar duplicatas
                            $chave_registro = "{$filial}_{$codigo_meta}_{$ano}_{$mes_atual}_{$cod_vendedor}_{$semana}";
                            
                            // DEBUG
                            $debug_log[] = "Processando: {$chave_registro}";
                            
                            if (isset($registros_processados[$chave_registro])) {
                                $debug_log[] = "DUPLICATA DETECTADA: {$chave_registro}";
                                continue; // Já processado
                            }
                            
                            $registros_processados[$chave_registro] = true;

                            // Converte valores para float
                            $valor1 = !empty($valores['valor1']) ? floatval(str_replace(['.', ','], ['', '.'], $valores['valor1'])) : null;
                            $valor2 = !empty($valores['valor2']) ? floatval(str_replace(['.', ','], ['', '.'], $valores['valor2'])) : null;

                            // Mantemos $registrar_log = false aqui, o log será consolidado
                            $id_criado = $this->DefineMeta(
                                $filial,
                                $codigo_meta,
                                $tipo_meta,
                                null,
                                $ano,
                                $mes_atual,
                                $valor1,
                                $valor2,
                                $cod_vendedor,
                                null,
                                $periodo,
                                $semana,
                                false // Não registrar log individual
                            );

                            if ($id_criado !== false) {
                                $debug_log[] = "INSERIDO: ID={$id_criado} - {$chave_registro}";
                                $ids_criados[] = $id_criado;

                                $dados_consolidados[] = [
                                    'id' => $id_criado,
                                    'codigo_filial' => $filial,
                                    'codigo_meta' => $codigo_meta,
                                    'codigo_vendedor' => $cod_vendedor,
                                    'valor_meta' => $valor1,
                                    'valor_meta_2' => $valor2
                                ];
                            } else {
                                $debug_log[] = "JÁ EXISTE NO BD: {$chave_registro}";
                            }
                        }
                    }
                }
            }
            
            // DEBUG: Salva log em arquivo temporário
            file_put_contents(__DIR__ . '/debug_metas.txt', implode("\n", $debug_log) . "\n\n", FILE_APPEND);

            // Agora registramos o log **consolidado**, mesmo que várias metas tenham sido criadas
            if (!empty($dados_consolidados) && isset($_SESSION['CodUsuario'], $_SESSION['NomeUsuario'])) {
                $this->registrarLogConsolidadoCriacao($dados_consolidados, $tipo_meta, $ano, $mes);
            }

            return $ids_criados;
        } catch (Exception $e) {
            echo 'Erro ao criar metas consolidadas: ' . $e->getMessage();
            return false;
        }
    }

    /**
     * Cria múltiplas metas de visitador com log consolidado
     */
    public function DefineMetaVisitadorConsolidada($dados_metas, $tipo_meta, $ano, $mes)
    {
        $ids_criados = [];
        $dados_consolidados = [];

        try {
            foreach ($dados_metas as $filial => $visitadores) {
                foreach ($visitadores as $cod_visitador => $tipos) {
                    $tipos_meta = [
                        '0' => ['valor1' => $tipos['meta1'] ?? null, 'valor2' => $tipos['meta2'] ?? null, 'percentual' => $tipos['percentual'] ?? null],
                        '1' => ['valor1' => $tipos['id_revenda'] ?? null, 'valor2' => $tipos['meta2'] ?? null, 'percentual' => $tipos['percentual_varejo'] ?? null]
                    ];

                    foreach ($tipos_meta as $codigo_meta => $valores) {
                        $valor1 = isset($valores['valor1']) ? floatval(str_replace([','], ['.'], $valores['valor1'])) : null;
                        $valor2 = isset($valores['valor2']) ? floatval(str_replace([','], ['.'], $valores['valor2'])) : null;
                        $percentual = isset($valores['percentual']) ? floatval(str_replace([','], ['.'], $valores['percentual'])) : null;

                        if ($valor1 !== null || $valor2 !== null) {
                            $id_criado = $this->DefineMeta(
                                $filial,
                                $codigo_meta,
                                $tipo_meta,
                                $percentual,
                                $ano,
                                $mes,
                                $valor1,
                                $valor2,
                                null,
                                $cod_visitador,
                            );

                            if ($id_criado) {
                                $ids_criados[] = $id_criado;

                                $dados_consolidados[] = [
                                    'id' => $id_criado,
                                    'codigo_filial' => $filial,
                                    'codigo_meta' => $codigo_meta,
                                    'codigo_visitador' => $cod_visitador,
                                    'valor_meta' => $valor1,
                                    'valor_meta_2' => $valor2,
                                    'percentual' => $percentual
                                ];
                            }
                        }
                    }
                }
            }

            if (!empty($dados_consolidados) && isset($_SESSION['CodUsuario'], $_SESSION['NomeUsuario'])) {
                $this->registrarLogConsolidadoCriacao($dados_consolidados, $tipo_meta, $ano, $mes);
            }

            return $ids_criados;
        } catch (Exception $e) {
            echo 'Erro ao criar metas de visitador consolidadas: ' . $e->getMessage();
            return false;
        }
    }


    /**
     * Registra log consolidado de criação de metas
     */
    public function registrarLogConsolidadoCriacao($dados_consolidados, $tipo_meta, $ano, $mes)
    {
        $tipo_meta_nome = $this->getTipoMetaNome($tipo_meta);
        $ids_registros = array_column($dados_consolidados, 'id');

        $detalhes = "Criação consolidada de metas - {$tipo_meta_nome} ({$ano}/{$mes}): ";
        $detalhes .= count($dados_consolidados) . " registro(s) criado(s)";

        // Remove o campo 'tipo_meta_nome' de cada item antes de salvar no log
        $dados_limpos = array_map(function($item) {
            unset($item['tipo_meta_nome']);
            return $item;
        }, $dados_consolidados);

        $dados_depois = [
            'tipo_meta' => $tipo_meta,
            'ano' => $ano,
            'mes' => $mes,
            'total_registros' => count($dados_consolidados),
            'ids_criados' => $ids_registros,
            'detalhes' => $dados_limpos
        ];

        registrarLogCriacaoDetalhado(
            30, // ID do módulo
            $_SESSION['CodUsuario'],
            $_SESSION['NomeUsuario'],
            json_encode($dados_depois),
            implode(',', $ids_registros)
        );
    }

    /**
     * Registra log consolidado de atualização de metas
     */
    public function registrarLogConsolidadoAtualizacao($dados_atualizacoes, $tipo_meta)
    {
        if (empty($dados_atualizacoes) || !isset($_SESSION['CodUsuario'], $_SESSION['NomeUsuario'])) {
            return false;
        }

        $tipo_meta_nome = $this->getTipoMetaNome($tipo_meta);
        $total_registros = count($dados_atualizacoes);

        $detalhes = "Atualização consolidada de {$total_registros} meta(s) - {$tipo_meta_nome}";

        // Prepara dados consolidados no formato JSON estruturado
        $dados_antes_formatados = [];
        $dados_depois_formatados = [];
        $ids_atualizados = [];

        foreach ($dados_atualizacoes as $dados) {
            $id = $dados['id'];
            $ids_atualizados[] = $id;

            // Formatar dados antes
            $dados_antes_formatados["Meta ID {$id}"] = [
                'valor_meta' => 'R$ ' . number_format($dados['dados_antes']['valor_meta'] ?? 0, 2, ',', '.'),
                'valor_meta_2' => isset($dados['dados_antes']['valor_meta_2']) && $dados['dados_antes']['valor_meta_2'] ? 'R$ ' . number_format($dados['dados_antes']['valor_meta_2'], 2, ',', '.') : 'Não definido',
                'filial' => $dados['dados_antes']['codigo_filial'] ?? '',
                'ano' => $dados['dados_antes']['ano'] ?? '',
                'mes' => $dados['dados_antes']['mes'] ?? '',
                'codigo_vendedor' => $dados['dados_antes']['codigo_vendedor'] ?? 'Não definido',
                'codigo_visitador' => $dados['dados_antes']['codigo_visitador'] ?? 'Não definido',
                'percentual' => $dados['dados_antes']['percentual'] ?? 'Não definido'
            ];

            // Formatar dados depois
            $dados_depois_formatados["Meta ID {$id}"] = [
                'valor_meta' => 'R$ ' . number_format($dados['dados_depois']['valor_meta'] ?? 0, 2, ',', '.'),
                'valor_meta_2' => isset($dados['dados_depois']['valor_meta_2']) && $dados['dados_depois']['valor_meta_2'] ? 'R$ ' . number_format($dados['dados_depois']['valor_meta_2'], 2, ',', '.') : 'Não definido',
                'filial' => $dados['dados_depois']['codigo_filial'] ?? '',
                'ano' => $dados['dados_depois']['ano'] ?? '',
                'mes' => $dados['dados_depois']['mes'] ?? '',
                'codigo_vendedor' => $dados['dados_depois']['codigo_vendedor'] ?? 'Não definido',
                'codigo_visitador' => $dados['dados_depois']['codigo_visitador'] ?? 'Não definido',
                'percentual' => $dados['dados_depois']['percentual'] ?? 'Não definido'
            ];
        }

        registrarLogAtualizacaoDetalhado(
            29, // ID do módulo
            $_SESSION['CodUsuario'],
            $_SESSION['NomeUsuario'],
            json_encode($dados_antes_formatados, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE),
            json_encode($dados_depois_formatados, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE),
            implode(',', $ids_atualizados)
        );

        return true;
    }


    /**
     * Registra log consolidado de exclusão de metas
     */
    public function registrarLogConsolidadoExclusao($dados_excluidos)
    {
        if (empty($dados_excluidos) || !isset($_SESSION['CodUsuario'], $_SESSION['NomeUsuario'])) {
            return false;
        }

        $ids_excluidos = array_column($dados_excluidos, 'id');
        $total_registros = count($dados_excluidos);

        $detalhes = "Exclusão consolidada de metas: {$total_registros} registro(s) excluído(s)";

        $dados_antes = [
            'total_registros' => $total_registros,
            'ids_excluidos' => $ids_excluidos,
            'detalhes' => $dados_excluidos
        ];

        registrarLogExclusaoDetalhado(
            30, // ID do módulo
            $_SESSION['CodUsuario'],
            $_SESSION['NomeUsuario'],
            json_encode($dados_antes),
            implode(',', $ids_excluidos)
        );
    }

    /**
     * Retorna o nome do tipo de meta
     */
    private function getTipoMetaNome($codigo_meta)
    {
        // Mapeamento correto dos tipos de meta baseado no sistema
        $tipos_meta = [
            '1' => 'Revenda',
            '2' => 'Manipulado',
            '3' => 'Marca Própria',
            '0' => 'Meta Geral'
        ];

        // Mapeamento das categorias de meta (tipo_meta na tabela define_metas)
        $tipos_categoria = [
            '2' => 'Vendedores',
            '3' => 'Loja',
            '4' => 'Visitadores'
        ];

        return $tipos_meta[$codigo_meta] ?? $tipos_categoria[$codigo_meta] ?? 'Desconhecido';
    }



    public function listarMetasDefinidas($id = '', $filial = 'Todos', $ano = '', $mes = '', $sqlFiltro = '', $periodo_sitema)
    {
        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 
         codigo_filial,
         ano,
         mes,
         tipo_meta,
         codigo_vendedor,
         -- codigo_visitador,
         semana,

         MAX(CASE WHEN codigo_meta = 1 THEN id END) AS id_revenda,
         MAX(CASE WHEN codigo_meta = 2 THEN id END) AS id_manipulado,
         MAX(CASE WHEN codigo_meta = 3 THEN id END) AS id_marca_propria,

         MAX(CASE WHEN codigo_meta = 1 THEN valor_meta END) AS revenda,
         MAX(CASE WHEN codigo_meta = 2 THEN valor_meta END) AS manipulado,
         MAX(CASE WHEN codigo_meta = 3 THEN valor_meta END) AS marca_propria,


         MAX(CASE WHEN codigo_meta = 1 THEN valor_meta_2 END) AS revenda2,
         MAX(CASE WHEN codigo_meta = 2 THEN valor_meta_2 END) AS manipulado2,
         MAX(CASE WHEN codigo_meta = 3 THEN valor_meta_2 END) AS marca_propria2,


         MAX(CASE WHEN codigo_meta = 0 THEN id END) AS id,
         MAX(CASE WHEN codigo_meta = 0 THEN valor_meta END) AS meta1,
         MAX(CASE WHEN codigo_meta = 0 THEN valor_meta_2 END) AS meta2
         -- MAX(CASE WHEN codigo_meta = 0 THEN percentual END) AS percentual,
         -- MAX(CASE WHEN codigo_meta = 1 THEN percentual END) AS percentual_varejo
         
            FROM 
            define_metas
        WHERE 
            codigo_meta IN (1, 2, 3,0)
         $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
        }
        if ($periodo_sitema !== 'Semana') {
            $sql .= " AND define_metas.semana IS NULL";
        }
        // Agrupando os resultados
        $sql .= "  GROUP BY 
            codigo_filial, 
        ano, 
        mes, 
        tipo_meta, 
        codigo_vendedor, 
      
        semana";

        // 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, 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 listarMetasDefinidasIndex($id = '', $filial = 'Todos', $ano = '', $mes = '', $sqlFiltro = '', $periodo_sitema)
    {
        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 
     codigo_filial,
     ano,
        mes,
     tipo_meta,
     codigo_vendedor,
     -- codigo_visitador,
     semana,

     -- Concatenar todos os IDs
     GROUP_CONCAT(id) AS ids,

     -- Continua seus campos
     MAX(CASE WHEN codigo_meta = 1 THEN id END) AS id_revenda,
     MAX(CASE WHEN codigo_meta = 2 THEN id END) AS id_manipulado,
     MAX(CASE WHEN codigo_meta = 3 THEN id END) AS id_marca_propria,

     MAX(CASE WHEN codigo_meta = 1 THEN valor_meta END) AS revenda,
     MAX(CASE WHEN codigo_meta = 2 THEN valor_meta END) AS manipulado,
     MAX(CASE WHEN codigo_meta = 3 THEN valor_meta END) AS marca_propria,

     MAX(CASE WHEN codigo_meta = 1 THEN valor_meta_2 END) AS revenda2,
     MAX(CASE WHEN codigo_meta = 2 THEN valor_meta_2 END) AS manipulado2,
     MAX(CASE WHEN codigo_meta = 3 THEN valor_meta_2 END) AS marca_propria2,

     MAX(CASE WHEN codigo_meta = 0 THEN id END) AS id,
     MAX(CASE WHEN codigo_meta = 0 THEN valor_meta END) AS meta1,
     MAX(CASE WHEN codigo_meta = 0 THEN valor_meta_2 END) AS meta2
     -- MAX(CASE WHEN codigo_meta = 0 THEN percentual END) AS percentual,
     -- MAX(CASE WHEN codigo_meta = 1 THEN percentual END) AS percentual_varejo


     FROM 
      define_metas
        WHERE 
     codigo_meta IN (0, 1, 2, 3)
         $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
        }
        if ($periodo_sitema !== 'Semana') {
            $sql .= " AND define_metas.semana IS NULL";
        }
        // Agrupando os resultados
        $sql .= "  GROUP BY 
            codigo_filial, 
        ano, 
        mes, 
        tipo_meta, 
        codigo_vendedor, 
      
        semana";

        // 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, 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;
    }
}
