<?php

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

class MetasAgrupadas
{
    private $mysqlConnection;

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

    public function MetasVendedores($filial = '', $ano = '', $mes = '', $codigo_vendedor = '', $quinzena = '', $semana)
    {
        require 'query-metas.php';

        $Metas = new Metas($connectionmysql);
        $codigosMeta = $Metas->listarMetas();

        $sumClauses = [];

        foreach ($codigosMeta as $meta) {
            if (!empty($meta['id']) && !empty($meta['nome_valores'])) {
                $codigo = $meta['id'];
                $nomeColuna = $meta['nome_valores'];

                // Condição para exibir valor_meta ou valor_meta_2 com base na quinzena
                if ($quinzena == '1') {
                    // Exibir apenas valor_meta
                    $sumClauses[] = "
                        SUM(
                            CASE 
                                WHEN codigo_meta = {$codigo} 
                                THEN valor_meta 
                                ELSE 0 
                            END
                        ) AS {$nomeColuna}";
                } elseif ($quinzena == '2') {
                    // Exibir valor_meta_2, mas se for 0, exibir metade de valor_meta
                    $sumClauses[] = "
                        SUM(
                            CASE 
                                WHEN codigo_meta = {$codigo} THEN 
                                    CASE 
                                        WHEN valor_meta_2 = 0 THEN valor_meta / 2
                                        ELSE IFNULL(valor_meta_2, 0)
                                    END
                                ELSE 0 
                            END
                        ) AS {$nomeColuna}";
                } else {
                    // Exibir a soma de valor_meta + valor_meta_2 (caso quinzena não seja especificada)
                    $sumClauses[] = "
                        SUM(
                            CASE 
                                WHEN codigo_meta = {$codigo} 
                                THEN valor_meta + IFNULL(valor_meta_2, 0) 
                                ELSE 0 
                            END
                        ) AS {$nomeColuna}";
                }
            }
        }

        // Evitando que implode cause erro se o array $sumClauses estiver vazio
        $sumPart = !empty($sumClauses) ? ', ' . implode(', ', $sumClauses) : '';

        $sql = "
        SELECT 
            mes, 
            ano, 
            codigo_filial, 
            codigo_vendedor
            $sumPart
        FROM define_metas
        WHERE tipo_meta = 2 ";

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

        if (!empty($filial) && $filial !== 'Todos') {
            // Divide $filial em array para preparar o SQL IN
            $filialArray = explode(',', $filial);

            // Converte o array de IDs de filiais em placeholders para a consulta
            $filiaisPlaceholders = implode(',', array_fill(0, count($filialArray), '?'));

            // Adiciona a condição SQL para o filtro de filiais
            $sql .= " AND define_metas.codigo_filial IN ($filiaisPlaceholders)";

            // Adiciona os parâmetros de filiais e tipos para consulta preparada
            $params = array_merge($params, $filialArray); // Adiciona as filiais nos parâmetros
            $types .= str_repeat('i', count($filialArray));  // Define o tipo 'i' para cada filial
        }

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

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

        if (!empty($semana)) {
            $sql .= " AND define_metas.semana IS NOT NULL";
            if ($semana !== 'mes') {
                $sql .= " AND define_metas.semana = ?";
                $params[] = (int)$semana;
                $types .= 'i';
            }
        } else {
            $sql .= " AND define_metas.semana IS NULL";
        }
        if (!empty($codigo_vendedor) && $codigo_vendedor !== 'Todos') {
            $sql .= " AND define_metas.codigo_vendedor = ?";
            $params[] = (int)$codigo_vendedor;
            $types .= 'i';
        }

        $sql .= " GROUP BY mes, ano, codigo_filial, codigo_vendedor";

        //echo $sql; // Para depuração

        // Preparando e executando a consulta
        $stmt = $this->mysqlConnection->prepare($sql);
        if (!$stmt) {
            throw new Exception('Erro na preparação da consulta MySQL: ' . $this->mysqlConnection->error);
        }

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

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

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

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

        $stmt->close();

        return $MetasLojas;
    }


    public function MetasLojas($filial = '', $ano = '', $mes = '',  $quinzena = '', $semana)
    {
        require 'query-metas.php';

        $Metas = new Metas($connectionmysql);

        $codigosMeta = $Metas->listarMetas();

        $sumClauses = [];

        foreach ($codigosMeta as $meta) {
            if (!empty($meta['id']) && !empty($meta['nome_valores'])) {
                $codigo = $meta['id'];
                $nomeColuna = $meta['nome_valores'];

                // Condição para exibir valor_meta ou valor_meta_2 com base na quinzena
                if ($quinzena == '1') {
                    // Exibir apenas valor_meta
                    $sumClauses[] = "
                        SUM(
                            CASE 
                                WHEN codigo_meta = {$codigo} 
                                THEN valor_meta 
                                ELSE 0 
                            END
                        ) AS {$nomeColuna}";
                } elseif ($quinzena == '2') {
                    // Exibir valor_meta_2, mas se for 0, exibir metade de valor_meta
                    $sumClauses[] = "
                        SUM(
                            CASE 
                                WHEN codigo_meta = {$codigo} THEN 
                                    CASE 
                                        WHEN valor_meta_2 = 0 THEN valor_meta / 2
                                        ELSE IFNULL(valor_meta_2, 0)
                                    END
                                ELSE 0 
                            END
                        ) AS {$nomeColuna}";
                } else {
                    // Exibir a soma de valor_meta + valor_meta_2 (caso quinzena não seja especificada)
                    $sumClauses[] = "
                        SUM(
                            CASE 
                                WHEN codigo_meta = {$codigo} 
                                THEN valor_meta + IFNULL(valor_meta_2, 0) 
                                ELSE 0 
                            END
                        ) AS {$nomeColuna}";
                }
            }
        }

        $sql = "
            SELECT 
                mes, 
                ano, 
                codigo_filial, 
                " . implode(', ', $sumClauses) . "
            FROM define_metas 
            WHERE tipo_meta = 3
        ";

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

        if (!empty($filial) && $filial !== 'Todos') {
            // Divide $filial em array para preparar o SQL IN
            $filialArray = explode(',', $filial);

            // Converte o array de IDs de filiais em placeholders para a consulta
            $filiaisPlaceholders = implode(',', array_fill(0, count($filialArray), '?'));

            // Adiciona a condição SQL para o filtro de filiais
            $sql .= " AND define_metas.codigo_filial IN ($filiaisPlaceholders)";

            // Adiciona os parâmetros de filiais e tipos para consulta preparada
            $params = array_merge($params, $filialArray); // Adiciona as filiais nos parâmetros
            $types .= str_repeat('i', count($filialArray));  // Define o tipo 'i' para cada filial
        }

        if (!empty($ano)) {
            $sql .= " AND define_metas.ano = ?";
            $params[] = (int)$ano;
            $types .= 'i';
        }

        if (!empty($mes)) {
            $sql .= " AND define_metas.mes = ?";
            $params[] = (int)$mes;
            $types .= 'i';
        }
        if (!empty($semana)) {
            $sql .= " AND define_metas.semana IS NOT NULL";
            if ($semana !== 'mes') {
                $sql .= " AND define_metas.semana = ?";
                $params[] = (int)$semana;
                $types .= 'i';
            }
        } else {
            $sql .= " AND define_metas.semana IS NULL";
        }
        $sql .= " GROUP BY mes, ano, codigo_filial";

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

        //echo $sql;

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

        $stmt->close();

        return $MetasLojas;
    }


    public function MetasDefinidas($id = '', $filial = '', $ano = '', $mes = '', $sqlFiltro = '', $exibirManipulado, $exibirRevenda, $exibirMarcaPropria, $periodo = null, $semana)
    {


        $sql = "SELECT 
                define_metas.codigo_filial AS codigo_filial,
                define_metas.ano,
                define_metas.mes";

        if ($exibirManipulado) {
            $sql .= ", SUM(CASE WHEN define_metas.codigo_meta = 2 THEN ";

            if (empty($periodo) || $periodo == 'mes') {
                $sql .= "COALESCE(define_metas.valor_meta, 0) + COALESCE(define_metas.valor_meta_2, 0) ";
            } elseif ($periodo == '1') {
                $sql .= "COALESCE(define_metas.valor_meta, 0) ";
            } elseif ($periodo == '2') {
                $sql .= "COALESCE(define_metas.valor_meta_2, 0) ";
            }

            $sql .= "ELSE 0 END) AS META_VALOR_MANIPULADO";
        } else {
            $sql .= ", 0 AS META_VALOR_MANIPULADO";
        }

        if ($exibirRevenda) {
            $sql .= ", SUM(CASE WHEN define_metas.codigo_meta = 1 THEN ";

            if (empty($periodo) || $periodo == 'mes') {
                $sql .= "COALESCE(define_metas.valor_meta, 0) + COALESCE(define_metas.valor_meta_2, 0) ";
            } elseif ($periodo == '1') {
                $sql .= "COALESCE(define_metas.valor_meta, 0) ";
            } elseif ($periodo == '2') {
                $sql .= "COALESCE(define_metas.valor_meta_2, 0) ";
            }

            $sql .= "ELSE 0 END) AS META_VALOR_REVENDA";
        } else {
            $sql .= ", 0 AS META_VALOR_REVENDA";
        }

        if ($exibirMarcaPropria) {
            $sql .= ", SUM(CASE WHEN define_metas.codigo_meta = 3 THEN ";

            if (empty($periodo) || $periodo == 'mes') {
                $sql .= "COALESCE(define_metas.valor_meta, 0) + COALESCE(define_metas.valor_meta_2, 0) ";
            } elseif ($periodo == '1') {
                $sql .= "COALESCE(define_metas.valor_meta, 0) ";
            } elseif ($periodo == '2') {
                $sql .= "COALESCE(define_metas.valor_meta_2, 0) ";
            }

            $sql .= "ELSE 0 END) AS META_VALOR_MARCA_PROPRIA";
        } else {
            $sql .= ", 0 AS META_VALOR_MARCA_PROPRIA";
        }

        // Agora adiciona o FROM sem vírgula final
        $sql .= " FROM define_metas WHERE 1=1 ";

        // Adiciona condições dinâmicas
        $params = [];
        $types = '';

        // Filtro por ID, se definido
        if (!empty($id)) {
            $sql .= " AND define_metas.id = ?";
            $params[] = $id;
            $types .= 'i';
        }

        // Filtro por filial (quando não é "Todos")
        if (!empty($filial) && $filial !== 'Todos') {
            $filiais = implode(',', array_fill(0, count($filial), '?'));
            $sql .= " AND define_metas.codigo_filial IN ($filiais)";
            $params = array_merge($params, $filial);
            $types .= str_repeat('i', count($filial));
        }

        // Filtro por ano, se não for "Todos"
        if (!empty($ano) && $ano !== 'Todos') {
            $sql .= " AND define_metas.ano = ?";
            $params[] = $ano;
            $types .= 'i';
        }

        // Filtro por mês, se não for "Todos"
        if (!empty($mes) && $mes !== 'Todos') {
            $sql .= " AND define_metas.mes = ?";
            $params[] = $mes;
            $types .= 'i';
        }
        if (!empty($semana)) {
            $sql .= " AND define_metas.semana IS NOT NULL";
            if ($semana !== 'mes') {
                $sql .= " AND define_metas.semana IN($semana)";
            }
        } else {
            $sql .= " AND define_metas.semana IS NULL";
        }
        // Adiciona a cláusula GROUP BY e ORDER BY
        $sql .= " AND tipo_meta = 3 GROUP BY define_metas.codigo_filial, define_metas.ano, define_metas.mes ";
        $sql .= " ORDER BY define_metas.codigo_filial, define_metas.ano, define_metas.mes";

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

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

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

        // Obtém e processa 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;
    }
}
