<?php

/**
 * Descripción de Conexion Apps
 *
 * Conexion a la Base de datos de las aplicaciones
 *
 * Licenciado bajo la Licencia Apache, Versión 2.0;
 * Usted no puede usar este archivo excepto en conformidad con la Licencia.
 * Usted puede obtener una copia de la Licencia en:
 *      http://www.php.net/license/3_01.txt. 
 * A menos que sea requerido por la ley aplicable o acordado por escrito, el software
 * Distribuido bajo la licencia se distribuye en una "AS IS" o  "COMO ESTA" BASE,
 * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, expresas o implícitas.
 * Consulte la Licencia para los permisos y Limitaciones bajo la Licencia.
 *
 * @package    Libreria\Conexiones\
 * @author     JUAN PABLO LLINAS RAMIREZ <jpllinas@ccsm.org.co>
 * @author     SICAM 20171025 <sicam32@ccsm.org.co>
 * @copyright  2017 Cámara de Comercio de Santa Marta para el Magdalena
 * @license    http://www.php.net/license/3_01.txt  PHP License 3.01
 * @version    201712140352
 * @link       http://sicam.ccsm.org.co/docs/libreria/conexiones/
 */

class AppsDB extends Conexiones {

    public static $instancia = null;
    
    public function __construct() {
        
        switch( VERSION_SICAM_EJECUCION ){
            case 'PRODUCCION':
                self::bdProduccion();
                break;
            case 'PREPRODUCCION':
                self::bdDesarrollo();
                break;
            case 'DESARROLLO':
            default:
                self::bdDesarrollo();
                break;
        }
        
            
        $this->dsn = 'mysql:host=' . self::$HOST . ';dbname=' . self::$BD_NAME;
        $this->username = self::$BD_USER;
        $this->password = self::$BD_PASSWORD;
        $this->options = array( PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8", PDO::ATTR_PERSISTENT => false );
            
        try {
            parent::__construct($this->dsn, $this->username, $this->password, $this->options);
            $this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        } catch (PDOException $e) {
            echo 'ERROR: ' . $e->getMessage() ."<br />";
            echo "Conexion desde la IP:". getHostByName(getHostName());
            die(); 
        }
    }

    
    public static function singleton() {
        if (!isset(self::$instancia)) {
            $miclase = __CLASS__;
            self::$instancia = new $miclase;
        }
        return self::$instancia;
    }
    
    

    private static function bdDesarrollo() {
        self::$HOST = '192.185.163.242';
        self::$BD_NAME = 'palmsoft_ccsm_apps';
        self::$BD_NAME_LOG =  'palmsoft_ccsm';
        self::$BD_USER =  'palmsoft_ccsm';
        self::$BD_PASSWORD =  'h6OCwyhh%B_)';
    }
    
    private static function bdPreProduccion() {
        self::$HOST = '192.185.163.242';
        self::$BD_NAME = 'palmsoft_ccsm_apps';
        self::$BD_NAME_LOG =  'palmsoft_ccsm';
        self::$BD_USER =  'palmsoft_ccsm';
        self::$BD_PASSWORD =  'h6OCwyhh%B_)';
    }

    private static function bdProduccion() {
        self::$HOST = '192.185.163.242';
        self::$BD_NAME = 'ccsm_sicam_apps';
        self::$BD_NAME_LOG =  'ccsm_sicam_log';
        self::$BD_USER =  'ccsm_sicam_prod';
        self::$BD_PASSWORD =  'Tu93175JJ#&@';
    }
    
    
    
    
    public static function iniciarTransaccion(){
        $conexion = self::singleton();
        if( !$conexion->inTransaction() ){
            $conexion->beginTransaction();
        }
    }
    
    public static function grabarTransaccion(){
        $conexion = self::singleton();
        if( $conexion->inTransaction() ){
            $conexion->commit();
        }
    }
    
    public static function cancelarTransaccion(){
        $conexion = self::singleton();
        if( $conexion->inTransaction() ){
            $conexion->rollBack();
        }
    }

    public static function selectUnaFila($sqlQuery, $datosQuery = array() ) {
        $conexion = self::singleton();
        try {
            //$conexion->beginTransaction();
            $sentenciaSql = $conexion->prepare($sqlQuery);
            $sentenciaSql->execute($datosQuery);
            $datos = $sentenciaSql->fetch(PDO::FETCH_OBJ);
            //$conexion->commit();
            if (!empty($datos)) {
                return $datos;
            }
            return NULL;
        } catch (PDOException $error) {
             if( $conexion->inTransaction() ){
                $conexion->rollBack();
            }
            throw $error;
        }
    }

    public static function selectVariasFilas($sqlQuery, $datosQuery = array() ) {
        $conexion = self::singleton();
        try {
            // $conexion->beginTransaction();
            $sentenciaSql = $conexion->prepare($sqlQuery);
            $sentenciaSql->execute($datosQuery);
            $datos = $sentenciaSql->fetchAll(PDO::FETCH_OBJ);
            // $conexion->commit();
            if (!is_null($datos)) {
                return $datos;
            }
            return NULL;
        } catch (PDOException $error) {
            if( $conexion->inTransaction() ){
                $conexion->rollBack();
            }
            throw $error;
        }
    }

    public static function insertFila($sqlQuery, $datosQuery = array() ) {
        $conexion = self::singleton();
        try {            
            //$conexion->beginTransaction();
            $sentenciaSql = $conexion->prepare($sqlQuery);
            $sentenciaSql->execute($datosQuery);
            $ultimoInsert = $conexion->lastInsertId();
            //$conexion->commit();
            if (!is_null($ultimoInsert)) {
                return $ultimoInsert;
            }
            return NULL;
        } catch (PDOException $error) {
            if( $conexion->inTransaction() ){
                $conexion->rollBack();
            }
            throw $error;
        }
    }

    public static function actualizarFila($sqlQuery, $datosQuery = array() ) {
        $conexion = self::singleton();
        try {
            //$conexion->beginTransaction();
            $sentenciaSql = $conexion->prepare($sqlQuery);
            $sentenciaSql->execute($datosQuery);
            $modificados = $sentenciaSql->rowCount();
            //$conexion->commit();
            if (!is_null($modificados)) {
                return $modificados;
            }
            return NULL;
        } catch (PDOException $error) {
             if( $conexion->inTransaction() ){
                $conexion->rollBack();
            }
            throw $error;
        }
    }

    
}

