<?php
require '../../conexao/conexao.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 COD_FILIAL,
              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 and FD.NOMEDEPTO = 'VENDAS'";

        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)
    {
        $duplicataEncontrada = false;
        $erroExecucao = false;

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

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

                // 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 = $this->connectionmysql->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 = $this->connectionmysql->prepare($insertQuery);


                $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'] < 1) {
                    // 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);
                    }
                }
                return true;
            } elseif ($tipo_meta == '4') {
                $checkQuery = "SELECT COUNT(*) AS total 
                   FROM define_metas 
                   WHERE codigo_filial = ? AND ano = ? AND mes = ? AND codigo_visitador = ?";
                $checkStmt = $this->connectionmysql->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 = $this->connectionmysql->prepare($insertQuery);


                // 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'] < 1) {
                    // 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);
                    }
                }

                return true;
            }
        } catch (Exception $e) {
            $this->connectionmysql->rollback(); // Reverte transação em caso de exceção
            echo 'Erro ao adicionar metas: ' . $e->getMessage();
            return false; // Falhou

        } finally {
            // Fecha as declarações
            // $checkStmt->close();
            $insertStmt->close();
        }
    }


    public function UpdateDefineMeta($id, $tipo_meta, $valor_meta = null, $valor_meta_2 = null, $comissao = null, $periodo = null)
    {
        if ($tipo_meta !== '4') {
            if ($periodo == 1) {
                // Atualiza apenas valor_meta
                $query = "UPDATE define_metas SET valor_meta = ? WHERE id = ?";
                $stmt = $this->connectionmysql->prepare($query);
                if ($stmt === false) {
                    echo 'Erro ao preparar a query: ' . $this->connectionmysql->error . "<br>";
                    return;
                }
                $stmt->bind_param('di', $valor_meta, $id);
            } elseif ($periodo == 2) {
                // Atualiza apenas valor_meta_2
                $query = "UPDATE define_metas SET valor_meta_2 = ? WHERE id = ?";
                $stmt = $this->connectionmysql->prepare($query);
                if ($stmt === false) {
                    echo 'Erro ao preparar a query: ' . $this->connectionmysql->error . "<br>";
                    return;
                }
                $stmt->bind_param('di', $valor_meta_2,  $id);
            } else {
                // Atualiza os dois
                $query = "UPDATE define_metas SET valor_meta = ?, valor_meta_2 = ? WHERE id = ?";
                $stmt = $this->connectionmysql->prepare($query);
                if ($stmt === false) {
                    echo 'Erro ao preparar a query: ' . $this->connectionmysql->error . "<br>";
                    return;
                }
                $stmt->bind_param('ddi', $valor_meta, $valor_meta_2,  $id);
            }
        } else {
            // Caso tipo_meta seja 4
            $query = "UPDATE define_metas SET valor_meta = ?, valor_meta_2 = ? WHERE id = ?";
            $stmt = $this->connectionmysql->prepare($query);
            if ($stmt === false) {
                echo 'Erro ao preparar a query: ' . $this->connectionmysql->error . "<br>";
                return;
            }
            $stmt->bind_param('ddi', $valor_meta, $valor_meta_2, $id);
        }

        if (!$stmt->execute()) {
            echo 'Erro ao atualizar a meta para o tipo ' . $tipo_meta . ': ' . $stmt->error . "<br>";
        }

        $stmt->close();
    }




    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 
         codigo_filial,
         ano,
         mes,
         tipo_meta,
         codigo_vendedor,
        

         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


            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
        }

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

        // 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 = '')
    {
        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,
     

     -- 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

    
     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
        }

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

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