<?php
header("Content-Type: text/html;charset=utf-8");

class cls_Conexion {

    private $mensaje = "";
    private $retorno = false;
    private $nro_filas = 0;
    private $lastId = 0;

    function Conexion() {
        $SERVER = "localhost";
        $SERVER = "localhost";
        $DBASE = "lacasad2_casaseguradb"; 
        $USER = "lacasad2_user_seguridad"; 
        $PASS = "El4m4n3c3r_d0r4d0"; 

        try {
            $db = new PDO("mysql:host=$SERVER;dbname=$DBASE", $USER, $PASS, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"));
            $mitz = "America/Lima";
            $tz = (new DateTime('now', new DateTimeZone($mitz)))->format('P');
            $db->exec("SET time_zone='$tz';");
            $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
			$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);
            $stmt = $db->prepare("SET NAMES 'utf8';");
            $stmt->execute();
            $this->mensaje = "Conexión establecida Correctamente...";
            $this->retorno = true;
            return $db;
        } catch (PDOException $e) {
            $this->mensaje = "Error de conexión.. " . $e->getMessage();
            $this->retorno = false;
        }
    }
    public function getMensaje() {
        return $this->mensaje;
    }
    public function getRetorno() {
        return $this->retorno;
    }
	private function execute_insert($sql, $datos){
		 /*echo("<br />".$sql."<br />");
		 var_dump($datos);*/
		 $cone = $this->Conexion();
		 try {
			 $stm = $cone->prepare($sql);
			 $stm->execute($datos);
			 if ($stm == true) {
				$this->lastId = $cone->lastInsertId();
				$this->mensaje = "REGISTRO GUARDADO CORRECTAMENTE...";
				$this->retorno = true;
			} else {
				$this->mensaje = "ERROR GUARDANDO EL REGISTRO...";
				$this->retorno = false;
			}
		} catch (Exception $ex) {
			$this->mensaje = "ERROR INESPERADO... " . $ex->getMessage();
			$this->retorno = false;
		}
	}
	private function execute_select($sql, $datos){
		$cone = $this->Conexion();
		try {
			$stm = $cone->prepare($sql);
			$stm->execute($datos);
			$tabla = $stm->fetchAll();
			$this->mensaje = "BUSQUEDA COMPLETADA...";
			$this->retorno = true;
			$this->nro_filas = count($tabla);
			return $tabla;
		} catch (Exception $ex) {
			$this->mensaje = "ERROR INESPERADO... " . $ex->getMessage();
			$this->retorno = false;
			$this->nro_filas = 0;
		}
		return [];
	}
	private function execute_update($sql, $datos){
		$cone = $this->Conexion();
		try {
			$stm = $cone->prepare($sql);
			$stm->execute($datos);
			if ($stm == true) {
				$this->mensaje = "REGISTRO ACTUALIZADO CORRECTAMENTE...";
				$this->retorno = true;
			} else {
				$this->mensaje = "ERROR ACTUALIZANDO EL REGISTRO...";
				$this->retorno = false;
			}
		} catch (Exception $ex) {
			$this->mensaje = "ERROR INESPERADO... " . $ex->getMessage();
			$this->retorno = false;
		}
	}
	private function execute_delete($sql, $datos){
		$cone = $this->Conexion();
		try {
			$stm = $cone->prepare($sql);
			$stm->execute($datos);
			if ($stm == true) {
				$this->mensaje = "REGISTRO ELIMINADO CORRECTAMENTE...";
				$this->retorno = true;
			} else {
				$this->mensaje = "ERROR ELIMINANDO EL REGISTRO...";
				$this->retorno = false;
			}
		} catch (Exception $ex) {
			$this->mensaje = "ERROR INESPERADO... " . $ex->getMessage();
			$this->retorno = false;
		}
	}
	public function contar_filas($nombretabla, $filtros = 1, $datos=[], $agrupar=""){
		$sql = 'SELECT COUNT(*) AS cantidad FROM ' . $nombretabla . ' WHERE ' . $filtros;
		if ($agrupar!=""){
			$sql = $sql . " GROUP BY " . $agrupar;
		}
		$response = $this->execute_select($sql, $datos);
		$numero = 0;
		if ( count ($response) > 1 ){
			$numero = count ($response);
		} else if (count ($response) == 1){
			$numero = $response[0]["cantidad"];
		}
		return $numero;
	}
	public function listar_filas($nombretabla, $filas, $orden, $direccion="ASC", $filtros = 1, $datos=[], $offset=0, $cantidad=0, $agrupar=""){
		$sql = 'SELECT ' . $filas . ' FROM ' . $nombretabla . ' WHERE ' . $filtros;
		if ($agrupar!=""){
			$sql = $sql . " GROUP BY " . $agrupar;
		}
		if ($direccion == "ASC"){
			$sql = $sql . '
					ORDER BY '.$orden.' ASC';
		} else if ($direccion == "DESC"){
			$sql = $sql . '
					ORDER BY '.$orden.' DESC';
		} else if ($direccion == "RAND"){
			$sql = $sql . '
					ORDER BY RAND()';
		}
		if ($cantidad>0){
			$sql = $sql . '
					LIMIT ? OFFSET ?';
		}
		if ($cantidad>0){
			array_push($datos, $cantidad);
			array_push($datos, $offset);
		}
		$response = $this->execute_select($sql, $datos);
		return $response;
	}
	public function buscar_datos($nombretabla, $filas, $filtros = 1, $datos=[], $agrupar=""){
		$sql = 'SELECT ' . $filas . ' FROM ' . $nombretabla . ' WHERE ' . $filtros;
		if ($agrupar!=""){
			$sql = $sql . " GROUP BY " . $agrupar;
		}
		$response = $this->execute_select($sql, $datos);
		return $response;
	}
	public function buscar_registro($busqueda, $datos=[]){
	    $response = $this->execute_select($busqueda, $datos);
	    return $response;
	}
    public function nuevo_registro($nombretabla, $datos) {
		$tb = new cls_Tablas();
		$sql = $tb->get_sql($nombretabla, 'N');
		$this->execute_insert($sql, $datos);
		return $this->retorno;
    }
    public function importar_registro($nombretabla, $datos) {
		$tb = new cls_Tablas();
        $sql = $tb->get_sql($nombretabla, 'I');
		$this->execute_insert($sql, $datos);
		return $this->retorno;
    }
    public function editar_registro($nombretabla, $datos) {
        $tb = new cls_Tablas();
        $sql = $tb->get_sql($nombretabla, 'E');
		$this->execute_update($sql, $datos);
		return $this->retorno;
    }
    public function eliminar_registro($nombretabla, $datos) {
        $tb = new cls_Tablas();
        $sql = $tb->get_sql($nombretabla, 'L');
		$this->execute_update($sql, $datos);
		return $this->retorno;
    }
    public function recuperar_registro($nombretabla, $datos) {
        $tb = new cls_Tablas();
        $sql = $tb->get_sql($nombretabla, 'R');
		$this->execute_update($sql, $datos);
		return $this->retorno;
    }
	//
    public function eliminar_completo_registro($sql, $datos) {
		$this->execute_delete($sql, $datos);
		return $this->retorno;
    }
	//
    public function getlastId() {
		return $this->lastId;
    }
}
?>
