<?
class CmsCRUD {
    private static $hiddenFields = [];
    
    static function setHiddenFields($fields){
        self::$hiddenFields = $fields;
    }
    static function listRecordsBulk($request,$throwError = true){
        global $TABLE_PREFIX;
        if (!@$request) throw new ApiError('No tableName specified');
        $data = [];
        foreach($request as $key => $value){
            $data[$key] = self::listRecords(@$value["where"],$key,$throwError,@$value["order"],@$value["limit"]);
        }
        return $data;
    }
    static function listRecords($whereArray = null,$tableName = null,$throwError = true,$order = null,$limit = null, $options = []){
        global $TABLE_PREFIX;
        if(!$tableName) throw new ApiError("No tableName specified");
        $data = CocoDB::get($tableName, $whereArray, $order, $limit, $options);
        return $data;
        /*$where = "num!=0";        
        
        if ($whereArray && is_array($whereArray)){
            //$whereArray = $whereArray["where"];
            
            if (!@$whereArray[0]) $whereArray = [$whereArray];
            foreach($whereArray as $value){
                if(!isset($value["column"]) || !isset($value["operator"]) || !isset($value["value"])) {
                    throw new ApiError('Missing parameters');
                }
                if(trim($value["column"]) === '') {
                    throw new ApiError('Field parameter cannot be empty');
                }
                $where.=" AND `".mysql_real_escape_string($value["column"])."` ";
                if(!in_array(strtoupper($value["operator"]), ["<",">","=","<=",">=","<=>","LIKE","!=","<>","IN"])) {
                    throw new ApiError('Operator not supported');
                }
                $where.=" ".$value["operator"]." ";
                if($value["operator"] === "IN" && is_array($value["value"])) {
                    $where.= "(".implode(',',array_map(function($each) { return "'".mysql_real_escape_string($each)."'"; }, $value["value"])).")";
                } else {
                    $where.= is_string($value["value"]) ? "'".mysql_real_escape_string($value["value"])."'" : mysql_real_escape_string($value["value"]);
                }
            }
        }
        
        $orderString = $order ? " ORDER BY ".$order : ''; 
        $limitString = $limit ? " LIMIT ".$limit : ''; 
        
        $listRecords_query = mysql_query("SELECT * FROM ".$TABLE_PREFIX.$tableName." WHERE ".$where.$orderString.$limitString);
        if(!$listRecords_query) throw new ApiError(mysql_error());
        $hiddenFields = self::$hiddenFields ? array_flip(self::$hiddenFields) : [];
        $listRecords = [];
        
        // Uploads
        $uploadsResult = self::getUploadsResults();
        $uploadsResult[$tableName] = isset($uploadsResult[$tableName]) ? $uploadsResult[$tableName] : [];
        $possible_keys_of_uploads = array_filter(array_keys(@$uploadsResult[$tableName]));
        
        // Records
        while($record = mysql_fetch_assoc($listRecords_query)){
            self::parseGetRecord($record,$tableName,@$schemas[$tableName], $options,@$uploadsResult);
            $listRecords[] = $record;
        }
        
        while ($row = mysql_fetch_assoc($listRecords_query)) {
            if (@$row["num"]){
                $resultUploads = @mysql_query_fetch_all_assoc("SELECT * FROM ".$TABLE_PREFIX."uploads WHERE tableName = '".$tableName."' AND recordNum=".intval($row["num"]));
                foreach($resultUploads as $upload){
                    if (!@$row[$upload["fieldName"]]) $row[$upload["fieldName"]] = [];
                    $row[$upload["fieldName"]][] = $upload;
                }
            }
            $row = array_diff_key($row,$hiddenFields);
            $row["tableName"] = $tableName;
            $listRecords[] = $row;
        }

        $listDetails =  [
            "totalRecords" => count($listRecords),
            "totalMatches" => count($listRecords),
            "perPage"      => 250,
            "keyword"      => "",
            "totalPages"   => 1,
            "page"         => 1,
            "prevPage"     => 1,
            "nextPage"     => 1
        ];
        
//        if (!@$listRecords && $throwError){
//            throw new ApiError('No '.$tableName.' were found');
//        }
        
        foreach($listRecords as $cont => $record){
            $listRecords[$cont]["datos"] = @$listRecords[$cont]["datos"] ? json_decode($listRecords[$cont]["datos"],true) : [];
        }
        
        $listRecords = array_map(function($r) {
            return API::t_recursivo($r, null);
        }, $listRecords);
        
        $data=[$listDetails,$listRecords];
        return $data;*/
        
    }
    
    static function removeRecord($id = null,$tableName = null){
        global $TABLE_PREFIX;
        if(!$tableName) throw new ApiError("No tableName specified");
        if (!@$id){
            throw new ApiError('No '.$tableName.' id was sent');
        }
        API::activity($id,$tableName,null,"DELETE");
        // $record = mysql_query_fetch_all_assoc("SELECT * FROM ".$TABLE_PREFIX."usuarios WHERE num = ".intval($id));
        $record = mysql_query("SELECT * FROM ".$TABLE_PREFIX.$tableName." WHERE num = ".intval($id));
        if(!$record) throw new ApiError(mysql_error());
        $record = mysql_fetch_assoc($record);

        if (!@$record){
            throw new ApiError('No '.$tableName.' was found');
        }else{
            mysql_query("DELETE FROM ".$TABLE_PREFIX.$tableName." WHERE num=".intval($record["num"])." LIMIT 1");
        }

        return ["success" => true];
    }
    
    static function getRecord($id = null,$tableName = null){
        global $TABLE_PREFIX;
        if(!$tableName) throw new ApiError("No tableName specified");
        if (!@$id){
            throw new ApiError('No '.$tableName.' id was sent');
        }
        
        // $record = mysql_query_fetch_all_assoc("SELECT * FROM ".$TABLE_PREFIX."usuarios WHERE num = ".intval($id)." LIMIT 1");
        $record = mysql_query("SELECT * FROM ".$TABLE_PREFIX.$tableName." WHERE num = ".intval($id));
        if(!$record) throw new ApiError(mysql_error());
        $record = mysql_fetch_assoc($record);

        if (!@$record){
            throw new ApiError('No '.$tableName.' was found');
        }
        if (@$record["num"]){
            
            $resultUploads = @mysql_query_fetch_all_assoc("SELECT * FROM ".$TABLE_PREFIX."uploads WHERE tableName = '".$tableName."' AND recordNum=".intval($record["num"]));
            foreach($resultUploads as $upload){
                if (!@$record[$upload["fieldName"]]) $record[$upload["fieldName"]] = [];
                $record[$upload["fieldName"]][] = $upload;
            }
        }

        return [$record];
    }
    static function tVar($identificador = null,$valor = null){
        if(!$identificador) throw new ApiError("No key specified");
        if(!$valor) throw new ApiError("No value specified");
        
        global $TABLE_PREFIX;
        $identifier = $identificador;
        if (defined($identifier)) return $valor;
        
        $recordtr = mysql_query_fetch_all_assoc("SELECT * FROM {$TABLE_PREFIX}textos_generales WHERE identificador='".$identifier."' LIMIT 1");

        if (@$recordtr){
            return ["text" => $recordtr[0]["texto"]];
        }else{
            CocoDB::insertRecords('textos_generales', ['identificador' => $identifier, 'texto' => $valor]);
            return ["text" => $valor];
        } 

    }
    
}