<?php 
    ini_set('display_errors', 1);
    ini_set('display_startup_erros', 1);
    error_reporting(E_ALL);
    require_once(__DIR__."/../config.php");
    
    try {

    	$cs = new cs;
        
        //["HTTP_X_REQUESTED_WITH"]=> string(14) "XMLHttpRequest" -- ["SERVER_PROTOCOL"]=> string(8) "HTTP/1.1" 
        if (!isset($_REQUEST['id']) OR empty($_REQUEST['id']) OR $_SERVER['HTTP_X_REQUESTED_WITH'] != 'XMLHttpRequest' OR $_SERVER['SERVER_PROTOCOL'] != 'HTTP/1.1') {
            throw new Exception("Você não tem permissão para acessar esta página", 500);
        }

        $request = $_POST; 

        $id  = $cs->filterKey($request['id']);

    	$row = $cs->fetchQuery($cs->executeQuery("SELECT * from gerenciadores WHERE (id = '{$id}' OR login = '{$id}')"));

     	$info_unf = $_SESSION['info_unf'];
        $id_unf   = $_SESSION['info_unf']['id'];

     	list($row) = $row;
     	
        $id = $row['id'];


    	$total_users = (string) $cs->num_rows($cs->executeQuery("SELECT * from gerenciadores WHERE gerenciador_responsavel='{$id_unf}'"));

    	$gg0 = $cs->fetchQuery($cs->executeQuery("SELECT * from gerenciadores WHERE gerenciador_responsavel='{$id_unf}' AND id !='".$row['id']."'"));

    	$limite_gg=0;

    	foreach($gg0 as $gg)
    	{
     	    $limite_gg+=(int) $gg['limite_usuarios'];
    	}

        $max = max((int) $_SESSION['info_unf']['limite_users_gerenciadores'], $limite_gg);
        $min = min((int) $_SESSION['info_unf']['limite_users_gerenciadores'], $limite_gg); 
    

        if (strtoupper($_SERVER['REQUEST_METHOD']) == 'POST' && $request['token'] == $_SESSION['tkn_log']) {
        	
            $data = [
                'senha'             => $cs->filterKey($request['senha']),
                'email'             => $cs->filterKey($request['email']),
                'vencimento'        => $cs->filterKey($request['vencimento'] ?? $row['vencimento']),
                'status'            => $cs->filterKey($request['status']),     
                'observacoes'       => $cs->filterKey($request['obs']), 
                'limite'            => (int) $cs->filterKey($request['limite']),
                'limiteg'           => (int) $cs->filterKey($request['limiteg']),
                'disponivel'        => $max - $min,
                'apagar_usr'        => $request['apagar_usr'] ?? '', 
                'criar_gerenciador' => $request['criar_gerenciador'] ?? '',
                'error'             => true  
            ]; 

        
             
            switch ($data) {
            	case !is_numeric($data['limite']):
                    throw new Exception("O limite deve ser em números!");
            		break;	
            	
            	case $data['disponivel'] <= 0:
                    throw new Exception("Você já alcançou seu limite de usuários para seu gerenciador.");
            		break;

            	case $data['limite'] > $data['disponivel']:
                    throw new Exception("O limite de usuários definido é maior que o disponível.<p>Insira um valor menor</p>");
            		break;

            	default:
            	    $data['error'] = false;	    			
        	        break;		
            }

        	
        	    
            if($data['error'] == false) {
                
                $senha      = $data['senha'];     
                $email      = $data['email'];      
                $vencimento = $data['vencimento']; 
                $limite     = $data['limite'];   
                $obs        = $data['observacoes'];  

                $status = $cs->filterKey($data['status']);
                
                if($status != "normal" && $status != "desativado") {
                    $status = "normal";
                }
            
                if($request['profilesPermitidos'] == '')
                {
                    $profilesPermitidos = $_SESSION['info_unf']['profiles_limitados'];
                
                } else {
                
                    $profilesPermitidos = implode(';', $request['profilesPermitidos']);
                
                }
                
                if ($data['criar_gerenciador'] == 'sim')
                {
                    $valor_gen_str = 'para permitir criar gerenciadores';
                    $valor_gen     = 1;
                    $criar_gen     = 1;
                } else {
                    $valor_gen_str = 'para não permitir criar gerenciadores';
                    $valor_gen     = '';
                    $criar_gen     = 'NULL';
                }
                
                if($data['apagar_usr'] == 'sim')
                {
                    $valor_apagar_str = 'para permitir apagar usuários';
                    $valor_apagar     = 1;
                    $apagar_usr       = 1;
                } else {
                    $valor_apagar_str = 'para não permitir apagar usuários';
                    $valor_apagar     = '';
                    $apagar_usr       = 'NULL';
                }
                
                
                switch ($row) {
                	case $row['limite_usuarios'] != $data['limite']:
                		$cs->insert_log_unf($_SESSION['info_unf']['login'], 'atualizoust', 'Atualizou o limite de usuários do gerenciador '.$row['login'].' de '.$row['limite_usuarios'].' para '.$limite);
                	
                	case $row['vencimento'] != $data['vencimento']:	        	
                		$cs->insert_log_unf($_SESSION['info_unf']['login'], 'atualizouv', 'Atualizou o vencimento do gerenciador '.$row['login'].' de '.date('d/m/Y', strtotime($row['vencimento'])).' para '.date('d/m/Y',strtotime($data['vencimento'])));
                		
                	case $row['status'] != $status:
                	    
                        $cs->insert_log_unf($_SESSION['info_unf']['login'], 'atualizoust', 'Atualizou o status do gerenciador '.$row['login'].' de '.$row['status'].' para '.$status);
            	    
            	    case $row['profiles_limitados'] != $profilesPermitidos:
            	        $cs->insert_log_unf($_SESSION['info_unf']['login'], 'atualizoust', 'Atualizou os profiles do gerenciador '.$row['login'].' de '.$row['profiles_limitados'].' para '.$profilesPermitidos);

            	    case $valor_apagar != $row['apagar_usuarios']:
            	        $cs->insert_log_unf($_SESSION['info_unf']['login'], 'atualizopera', 'Atualizou a permissão do gerenciador '.$row['login'].' '.$valor_apagar_str); 

            	    case $valor_gen != $row['criar_gerenciador']:
            	        $cs->insert_log_unf($_SESSION['info_unf']['login'], 'atualizouperc', 'Atualizou a permissão do gerenciador '.$row['login'].' '.$valor_gen_str); 
                }

                
                
                if ($data = $cs->executeQuery("
                	UPDATE 
                	    gerenciadores 
                	SET apagar_usuarios      = '{$apagar_usr}', 
                	    vencimento           = '{$vencimento}',
                	    status               = '{$status}',
                        observacoes          = '{$obs}',
                	    limite_gerenciadores = '{$data['limiteg']}',
                        profiles_limitados   = '{$profilesPermitidos}', 
                	    criar_gerenciador    = '{$criar_gen}', 
                	    senha                = '{$senha}', 
                	    email                = '{$email}', 
                	    limite_usuarios      = '{$limite}' 

                	WHERE id = '{$id}'"))
                {
                    
                    if ($row['status'] != $status) {
                    
                       getPai($id);    
                    }

                    echo json_encode([ 
                        'success' => true, 
                        'class'   => 'alert-success', 
                        'text'    => "Atualizado com sucesso! ---" . print_r($cs->errors)
                    ]);
                }          
            } 
        } 
    } catch (Exception $e) {
        echo json_encode([ 
            'success' => false, 
            'class'   => 'alert-danger', 
            'text'    => $e->getMessage()
        ]); 
    }   

/* FUNCOES PARA ALTERAR O STATUS EM TODOS OS GERENCIADORES E USUARIOS */

function getManagers($id) {
    
    $cs = new cs;
    
    $query = "SELECT login, id, gerenciador_responsavel FROM gerenciadores WHERE gerenciador_responsavel = '{$id}' GROUP BY id";
    
    $query = $cs->executeQuery($query);
    
    if ($cs->num_rows($query)  > 0) { 
        return $cs->fetchQuery($query);
    }
}

function getUsers($id, $users = []) {
    
    $cs = new cs;
    
    $query = "SELECT id, login FROM usuarios WHERE id_gerenciador = '{$id}'";
    
    $query = $cs->executeQuery($query);
    
    if ($cs->num_rows($query)  > 0) { 

        $data = $cs->fetchQuery($query);
    
        foreach ($data as $value) {
            
            if ($value) {
                $users['users'][]  = $value['id'];
                $users['xtream'][] = $value['login'];
            }
        }
        
        $users['users']  = implode(',', $users['users']);
        //$users['xtream'] = implode(',', $users['xtream']);
         
        return $users; 
    }
}

function updateManager($id, $status = 'desativado') 
{
    $cs = new cs;
    
    if ($id) {
        $query = "UPDATE gerenciadores SET status = '{$status}' WHERE gerenciador_responsavel = '{$id}'";
        $cs->executeQuery($query);
    }

}

function getStatus($id = null) 
{
    $cs = new cs;

    $query = "SELECT status FROM gerenciadores WHERE id = '{$id}'";
    $query = $cs->executeQuery($query);
    if ($cs->num_rows($query)  > 0) {
        return $cs->fetchQuery($query)[0]['status'];
    }  
}

function updateUsers($id, $status = 'desativado') 
{
    $cs = new cs;
    
    if ($id) {
        $query = "UPDATE usuarios SET status = '{$status}' WHERE id_gerenciador = '{$id}'";
        
        $cs->executeQuery($query);
    }

}

function updateXtreamUsers($ids, $enabled = 0) 
{
    $xtream = new Sql();
       
    if ($ids) {
        foreach ($ids as $id) {
        
            $query = "UPDATE xtream_iptvpro.users SET enabled = :enabled WHERE username = :id";
            
            $xtream->query($query, [
                ':id'     =>  $id,
                ':enabled' => $enabled 
            ]);
        }
    }

    

}


function getPai($id) {
    //Primeiro pego o status atual do gerenciador responsavel
    $status = getStatus($id);
    // De acordo com o status ativo ou desativo na xtream
    $enabled = ($status == 'normal') ? 1 : 0;
    
    // Atualizo o status do gerenciador passando o status atual 
    updateManager($id, $status); 
    
    $users = getUsers($id);
    // Atualizo o status dos usuarios passando o status atual do gerenciador
    updateUsers($id, $status); 

    // Atualizo o status dos usuarios passando o status atual do gerenciador na xtream
    updateXtreamUsers($users['xtream'], $enabled);    

    $data = getManagers($id);   
      
    if (!is_null($data) AND count($data) > 0) {
        foreach ($data as $key => $value) {
            
            if (isset($value['id']) ) {
                
                getPai($value['id']);                                   
            }           
        }       
    }    
}
