<?php
include_once("conex_bd.php");

class Servidor_Base_Datos
{
    private $servidor;
    private $usuario;
    private $pass;
    private $base_datos;
    private $descriptor = false; //	var $con=false;
    private $sqlAct = '';
    var $error_id = false;
    var $resultado = false;
    var $columnas;
    private $totalReg;
    var $msg1 = "Not connected to MySQL Server! Please check your connection data or call function \"connect()\" first";
    var $msg2 = "Please check your SQL statement or call function \"speak()\" first!";
    function __construct($servidor = "localhost", $usuario = "root", $pass = "123", $base_datos)
    {
        $this->servidor = $servidor;
        $this->usuario = $usuario;
        $this->pass = $pass;

        if ($base_datos == 'jegaedu_webaca2018') {
            $base_datos = 'jegaedu_webaca2018bk';
        }

        $anio = intval(preg_replace('/[^0-9]+/', '', $base_datos), 10);
        //echo $base_datos. " - ". strpos($base_datos, 'olim_x') ." - ";
        if(strpos($base_datos, 'olim_')!==false && $anio>=2023 ){
            $base_datos='ieptolimon_acaweb'.$anio;
        }
		if(strpos($base_datos, 'siprointel_acafrayptel')!==false && $anio>=2025 ){
            $base_datos='siprointel_acafrayptel' ;
        }
        $this->base_datos = $base_datos;

        $this->conectar_base_datos();

    }

    private function conectar_base_datos()
    {
        //echo "--- wd -- SERV" .$this->servidor." USER: ".$this->usuario." BDS: ".$this->base_datos."<BR>";
        $this->descriptor = mysqli_connect($this->servidor, $this->usuario, $this->pass,$this->base_datos,3306);
        if (mysqli_connect_errno()) {
            echo "Failed to connect to MySQL: " . mysqli_connect_error();
            exit();
        }

        mysqli_select_db($this->descriptor, $this->base_datos) or die ("Error al Seleccionar la Base de Datos: " . $this->base_datos);
        mysqli_query($this->descriptor, "SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci';") or die('Error al seleccionar UTF');
        $sql = 'SET @@SESSION.sql_mode = "NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION";';
        mysqli_query($this->descriptor, $sql) or die('Error al seleccionar el sql_mode');
    }

    function SetDatabase($dbName)
    {
        if (!$this->descriptor)
            return false;

        if (!($result = mysqli_select_db($this->descriptor, $dbName)))
            die("Error al Seleccionar la Base de Datos");
        //$this->SetError("SetDatabase", mysql_error($this->_connection));
//		else{
        //$result = $this->_arguments["Database"];
        //$this->_arguments["Database"] = $dbName;
//		}
        return $result;
    }

    public function instruccion($consulta, $op = 0, $aud = 0)
    {

        if (empty($consulta))
            return false;

        if (!$this->descriptor) {

            $this->error_id = $this->msg1;
            //$this->makeerror();
            return false;
        }


        if ($this->descriptor) {

            $this->sqlAct = $consulta;
            $this->resultado = mysqli_query($this->descriptor, $consulta) or die(printf("Error: %s\n%s", mysqli_error($this->descriptor),$consulta));

            if ($op != 0)
                $this->total();

            if ($this->extraer_error() == 0) {
                if ($aud == 0) {
                    $sess = new sesion();
                    $cad = trim(strtolower($consulta));
                    $pos = strpos($cad, 'select');
                    if ($pos === FALSE) {
                        $sql = "INSERT INTO adm_auditoria (ide_usuario, fecha_tran, ip_usuario, cadena_tran, nom_arch) VALUES ('" . $sess->get('ac_userid') . '-' . $sess->get('ac_identidad') . "','" . date('Y-m-d H:m:i') . "','" . $this->getRealIP() . "','" . $this->escapar($consulta) . "','narch');";
                        #$this->auditar($sql);
                    }
                }
            }
        }

    }

    private function total()
    {
        $cn = mysqli_query($this->descriptor, "SELECT FOUND_ROWS()");
        $r = mysqli_fetch_row($cn);
        $this->totalReg = $r[0];
    }

    public function totReg()
    {
        return $this->totalReg;
    }

    private function auditar($sql)
    {
        $ruta = realpath(dirname(__FILE__));
        #$npro=substr_count($ruta,'/')-2;
        #$dir=str_repeat("../", $npro);
        $dir = $ruta;
        $nombre_archivo = $dir . "/auditoria/auditar.txt";
        $contenido = str_replace('narch', $_SERVER['PHP_SELF'], $sql);
        if (!file_exists($dir . '/auditoria')) {
            mkdir($dir . '/auditoria', 0777);
            if (!$gestor = fopen($nombre_archivo, 'a')) {
            }
            if (fwrite($gestor, $contenido) === FALSE) {
            }
            fputs($gestor, chr(13) . chr(10));
            fclose($gestor);
        } elseif (!file_exists($nombre_archivo)) {
            if (!$gestor = fopen($nombre_archivo, 'a')) {
            }
            if (fwrite($gestor, $contenido) === FALSE) {
            }
            fputs($gestor, chr(13) . chr(10));
            fclose($gestor);
        }
        if (is_writable($nombre_archivo)) {
            if (!$gestor = fopen($nombre_archivo, 'a')) {
            }
            if (fwrite($gestor, $contenido) === FALSE) {
            }
            fputs($gestor, chr(13) . chr(10));
            fclose($gestor);
        }
    }

    public function fetchAll()
    {
        $data = array();
        while ($row = mysqli_fetch_array($this->resultado, MYSQLI_BOTH)) {
            $data[] = $row;
        }
        return $data;
    }

    function getRealIP()
    {
        if (!empty($_SERVER['HTTP_CLIENT_IP']))
            return $_SERVER['HTTP_CLIENT_IP'];

        if (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))
            return $_SERVER['HTTP_X_FORWARDED_FOR'];

        return $_SERVER['REMOTE_ADDR'];
    }

    public function extraer_registro()
    {
        if (!$this->descriptor) {
            $this->error_id = $this->msg1;
            //$this->makeerror();
            return false;
        }
        if (!$this->resultado) {
            $this->error_id = $this->msg2;
            //$this->makeerror();

            return false;
        }

        $fila = mysqli_fetch_array($this->resultado, MYSQLI_ASSOC);


        if ($fila) {
            return $fila;
        } else {
            return false;
        }
    }

    public function extraer_registro_num()
    {
        if (!$this->descriptor) {
            $this->error_id = $this->msg1;
            //$this->makeerror();
            return false;
        }
        if (!$this->resultado) {
            $this->error_id = $this->msg2;
            //$this->makeerror();
            return false;
        }

        if ($fila = mysqli_fetch_row($this->resultado)) {
            return $fila;
        } else {
            return false;
        }
    }

    public function num_rows()
    {
        if (!$this->descriptor) {
            $this->error_id = $this->msg1;
            //$this->makeerror();
            return false;
        }
        if (!$this->resultado) {
            $this->error_id = $this->msg2;
            //$this->makeerror();
            return false;
        }
        return mysqli_num_rows($this->resultado);
    }

    public function filas_afectadas()
    {
        if (!$this->descriptor) {
            $this->error_id = $this->msg1;
            //$this->makeerror();
            return false;
        }
        if (!$this->resultado) {
            $this->error_id = $this->msg2;
            //$this->makeerror();
            return false;
        }
        return mysqli_affected_rows($this->descriptor);
    }

    public function escapar($cad)
    {
        return mysqli_real_escape_string($this->descriptor, $cad);
    }

    public function ultima_fila()
    {
        if (!$this->descriptor) {
            $this->error_id = $this->msg1;
            //$this->makeerror();
            return false;
        }
        if (!$this->resultado) {
            $this->error_id = $this->msg2;
            //$this->makeerror();
            return false;
        }
        return mysqli_insert_id($this->descriptor);
    }

    public function liberar()
    {
        if ($this->resultado)
            mysqli_free_result($this->resultado);
    }

    public function cerrar()
    {
        if ($this->descriptor)
            mysqli_close($this->descriptor);
    }

    public function extraer_error()
    {
        $error = mysqli_errno($this->descriptor);
        return $error;
    }

    public function extraer_error_msg()
    {
        $error = mysqli_error($this->descriptor);
        $msg = $error;
        if (stripos($error, "Duplicate") !== false) {
            $msg = "El registro ya existe";
        }

        if ($error == 1451) {
            $msg = "El registro tiene relación con otro modulo o tabla";
        }

        if (stripos($error, "Cannot delete or update a parent row: a foreign key constraint") !== false) {
            $msg = "El registro tiene relación con otro modulo o tabla";
        }
        return $msg;
    }
}

?>