<?php

class {NOMBRE_CLASE} {
    /* @var $db $DbMySQL */
    protected $db;

    /* @var $RID RandId */
    protected $RID;

    public function __construct() {
        $this->db = $GLOBALS['db'];
        $this->RID = $GLOBALS['RID'];
    }

    function Ejecutar($Accion) {
        switch ($Accion) {
            case "Listar":
                $this->Listar();
                break;

            case "agregar":
                $this->Agregar();
                break;

            case "asignar":
                $this->Asignar();
                break;

            case "listar":
                $this->Listar();
                break;

            case "modificar":
                $this->Modificar();
                break;

            case "eliminar":
                $this->Eliminar();
                break;
{PHP_EJECUTAR}
        }
    }

    function Validar() {
        $v = new Validation($_POST); 
{VALIDACIONES}
        $result = $v->Validate();
        if ($result['messages'] !== "") { //Hay errores de validación
            $r['error'] = true;
            $r['msg'] = $result['messages'];
            $r['bad_fields'] = $result['bad_fields'];
            $r['errors'] = $result['errors'];
            echo json_encode($r);
            exit(0);
        }
        return true;
    }

    protected function GetSQL() {
        $RID = $this->RID;

{PHP_FILTROS}

        $sql = "SELECT * FROM {BASE_DATOS}.{TABLA} {SQL_FILTROS}";
        return $sql;
    }

    protected function Fila({VARIABLE_CLAVE_PRIMARIA} = NULL) {
        $db = $this->db;
        $sql_base = $this->GetSQL();

        //Revisar
        if ({VARIABLE_CLAVE_PRIMARIA} == NULL) {
            {VARIABLE_CLAVE_PRIMARIA} = $db->last_insert_id();
        }

        $sql = "SELECT * FROM ($sql_base) AS t WHERE {CLAVE_PRIMARIA}='{VARIABLE_CLAVE_PRIMARIA}' ";

        $row = $db->select_row($sql);
        $row['{CLAVE_PRIMARIA}'] = $this->RID->GetRandId({VARIABLE_CLAVE_PRIMARIA});
        return $row;
    }

    function Listar() {
        $db = $this->db;
        $RID = $this->RID;
        $sql = $this->getSQL();

        $Result=[];
        $Result['total'] = $db->count_rows($sql);

        $Offset = $_GET['offset'];
        $Limit = $_GET['limit'];

        $rs = $db->select_limit($sql, $Limit, $Offset);
        $Result['rows'] = array();
        $Num = $Offset + 1;
        while ($Row = $db->fetch_assoc($rs)) {
            $Row['_NUM_'] = $Num++;
            $Row['{CLAVE_PRIMARIA}'] = $RID->GetRandId($Row['{CLAVE_PRIMARIA}']);
            $Result['rows'][] = $Row;
        }
        echo json_encode($Result);
    }

    function Agregar() {
        $db = $this->db;
        $RID = $this->RID;

        $this->Validar();

        $Row = [];
{CODIGO_AGREGAR}
        $db->insert('{BASE_DATOS}.{TABLA}', $Row);
        //
        $result = array();
        if ($db->error()) {
            $result['error'] = true;
            $result['msg'] = $db->error();
        } else {
            $result['error'] = false;
            $result['msg'] = "Registro agregado con éxito";
            $result['row'] = $this->fila();
        }
        echo json_encode($result);
    }

    function Asignar() {
        $db = $this->db;
        $RID = $this->RID;
        {VARIABLE_CLAVE_PRIMARIA} = $RID->GetValue($_GET['{CLAVE_PRIMARIA}']);

        $sql = "SELECT * FROM {BASE_DATOS}.{TABLA} WHERE {CLAVE_PRIMARIA}='{VARIABLE_CLAVE_PRIMARIA}'";
        $Row = $db->select_row($sql);
        $Row['{CLAVE_PRIMARIA}'] = $RID->GetRandId($Row['{CLAVE_PRIMARIA}']);
{CODIGO_ASIGNAR}
        echo json_encode($Row);
    }

    function Modificar() {
        $db = $this->db;
        $RID = $this->RID;

        $this->Validar();

        $Row = [];
{CODIGO_MODIFICAR}
        {VARIABLE_CLAVE_PRIMARIA} = $this->RID->GetValue($_POST['{CLAVE_PRIMARIA}']);
        $sql = $db->make_update("{BASE_DATOS}.{TABLA}", $Row) . " WHERE {CLAVE_PRIMARIA}='{VARIABLE_CLAVE_PRIMARIA}'";
        $db->query($sql);

        $r = array();
        if ($db->error()) {
            $r['error'] = true;
            $r['msg'] = $db->error();
        } else {
            $r['error'] = false;
            $r['msg'] = "Registro modificado con éxito.";
            $r['row'] = $this->Fila({VARIABLE_CLAVE_PRIMARIA});
        }
        echo json_encode($r);
    }

    function Eliminar() {
        $db = $this->db;
        {VARIABLE_CLAVE_PRIMARIA} = $this->RID->GetValue($_POST['{CLAVE_PRIMARIA}']);
        $sql = "DELETE FROM {BASE_DATOS}.{TABLA} WHERE {CLAVE_PRIMARIA}='{VARIABLE_CLAVE_PRIMARIA}'";
        $db->query($sql);

        $r = array();
        if ($db->error()) {
            $r['error'] = true;
            $r['msg'] = $db->error();
        } else {
            $r['error'] = false;
            $r['msg'] = "Registro eliminado con éxito.";
        }
        echo json_encode($r);
    }
{PHP_ACCIONES}
}

$f = new {NOMBRE_CLASE}();
$f->Ejecutar(ACCION);
?>
