<?php
namespace imcat;

/*
    get($mod, $whr='', $lmt='10', $ord='', $ops=[]);
    $mod: news, news.join
    $whr: `show`='all', `show`='0', 
    $lmt: 1, 10, 3,10, 10.page, count
    $ord: atime-1, atime
    $ops: xxx
*/  

class glbData{

    static 
$cfg = []; 
    static 
$mod$whr$lmt$ord;
    static 
$type$sql// , $res=[]

    // whr: "catid='abc'", "did='2020-key'", "catid='abc' AND xxx"
    
static function cdata($whr$lmt=1$ord='click-0'){
        
$cats read('cdata.i');
        if(isset(
$cats[$whr])){
            
$where "catid='$whr'";
        }elseif(
preg_match("/[\w|\-]+/i"$whr)){
            
$where "did='$whr'";
        }else{
            
$where $whr;
        }
        
$data self::get('cdata.join'$where$lmt$ord);
        if(!
$data) return [];
        
$tarr $lmt>?$data : [$data] ;
        foreach(
$tarr as $rk=>$row){
            
$vtype $row['vtype'];
            
$vext $row['vext'];
            if(
$vtype=='kv'){
                
$vdata basElm::text2arr($vext);
            }elseif(
$vtype=='md'){
                
$vdata extMkdown::pdorg($vext);
            }elseif(
$vtype=='json'){
                
$vdata comParse::jsonDecode($vext);
            }elseif(
$vtype=='sec'){
                
$vext preg_replace_callback("/\s+\[\-\-\-\]+\s+/i", function($itms){
                    return 
"[---]"// 去=号两边空白
                
}, $vext);
                
$vdata explode('[---]'$vext);
            }else{ 
// text
                
$vdata '';
            }
            if(!empty(
$row['exfile'])){
                
$tarr[$rk]['exfile'] = comStore::picsTab($row['exfile'],0); 
            }
            
$tarr[$rk]['vdata'] = $vdata;
        }
        return 
$lmt>$tarr $tarr[0];
    }

    
// 
    
static function get($mod$whr=''$lmt='10'$ord=''$ops=[]){ 
        
self::imod($mod);
        
self::iwhr($whr);
        
self::ilmt($lmt);
        
self::iord($ord);
        return 
self::data();
    }
    static function 
data(){
        
$db glbDBObj::dbObj();
        
$sfrom "* FROM ".$db->pre.self::$cfg['tab'].$db->ext;
        
$where = empty(self::$whr) ? '' self::$whr;
        
// data
        
if(self::$type=='count'){
            
$res $db->table(self::$cfg['tab'])->where($where)->count();
            
self::$sql $db->getSql();
            return 
$res;
        }elseif(
self::$type=='page'){
            
$pres self::dpage($sfrom$where);
            
self::$sql $pres[1];
            
$res $pres[0]; 
        }else{
            
$where && $where "WHERE ".self::$whr;
            
$limit self::$type=='list' self::$lmt '1';
            
self::$sql "SELECT $sfrom $where ORDER BY ".self::$ord." LIMIT $limit";
            
$res $db->query(self::$sql); 
        } 
//dump(self::$sql);
        // join
        
$fpk self::$cfg['fpk'];
        if(!empty(
self::$cfg['join']) && in_array($fpk, ['did','kid'])){
            
dopFunc::joinDext($resself::$mod$fpk);
        }
        if(
self::$type=='1' && $res$res $res[0];
        return 
$res ?: [];
    }
    static function 
dpage($sfrom$where){
        global 
$_cbase
        
$ord str_replace([' ASC','DESC'], ''self::$ord);
        
$pg = new comPager($sfrom$whereself::$lmt$ord);
        
$pg->set('odesc'strpos(self::$ord,' ASC')?0:1); // ? 1,0
        
$pg->set('opkey'0);
        
$res $pg->exe(); $sql $pg->sql
        
$idfirst ''$idend '';
        if(
$res){
            
$i current($res); $idfirst current($i); 
            
$i end($res); $idend current($i); 
        }
        
$scname basEnv::serval("REQUEST_URI"); //REQUEST_URI,SCRIPT_NAME
        
$burl basReq::getUri(-1,'','page|prec|ptype|pkey');
        
$_cbase['page']['bar'] = "<div class='pg_bar'>".$pg->show($idfirst,$idend,'',$burl)."</div>";
        
$_cbase['page']['prec'] = $pg->prec;
        
$_cbase['page']['pcnt'] = intval($pg->pcnt);
        return [
$res$sql[0]];
    }

    
# ================================== 

    // ord: atime-1, atime
    
static function iord($ord){
        if(
strpos($ord,',')){
            
self::$ord $ord;
            return;
        }
        
$ord || $ord self::$cfg['ord'].'-1';
        if(
strpos($ord,'-')){
            
$tmp explode('-',$ord);
            
$ord "$tmp[0] ".(empty($tmp[1]) ? 'ASC' 'DESC');
        }else{
            
$ord "$ord DESC";
        }
        
self::$ord $ord;
    }
    
// lmt: 1, 10, 3,10, 10.page, count
    
static function ilmt($lmt){
        if(
$lmt=='count'){
            
self::$lmt '';
            
self::$type 'count';
        }elseif(
strpos($lmt,'.')){
            
self::$lmt intval($lmt);
            
self::$type 'page';
        }else{
            
self::$lmt $lmt;
            
self::$type self::$lmt!='1' 'list' '1';
        }
    }
    
// whr: `show`='all'
    
static function iwhr($whr){
        
$whr $whr ?: '';
        
$_groups glbConfig::read('groups'); 
        
$pid self::$cfg['pid'];
        if(
in_array($pid,array('docs','users','coms','advs'))){
            if(
strstr($whr,"`show`='all'")){
                
$whr str_replace([" AND `show`='all'","`show`='all' AND ","`show`='all'"],'',$whr);
            }elseif(
strstr($whr,'`show`')){ 
                
// 
            
}else{ //if(!strstr($whr,'`show`=')){ 
                
$whr .= " AND (`show`='1')";
            } 
        }
        if(
substr($whr,0,5)==' AND '$whr substr($whr,5);
        
self::$whr $whr;
        return 
$whr;
    }
    
// mod: news, news.join
    
static function imod($mod){
        
$_groups glbConfig::read('groups');
        
self::$cfg['join'] = strpos($mod,'.');
        
$tmp explode('.'$mod);
        
self::$mod $mod $tmp[0];
        if(empty(
$_groups[$mod])){ glbError::show("{$mod} NOT Found!",0); }
        
self::$cfg['pid'] = $pid $_groups[$mod]['pid'];
        
// infos
        
if($pid=='docs'){
            
$tab 'docs_'.$mod;
            
$ord $fpk 'did';
        }elseif(
$pid=='users'){
            
$tab 'users_'.$mod;
            
$ord 'atime'$fpk 'uid';
        }elseif(
$pid=='advs'){
            
$tab 'advs_'.$mod;
            
$ord 'atime'$fpk 'aid';
        }elseif(
$pid=='coms'){    
            
$tab 'coms_'.$mod;
            
$ord $fpk 'cid';
        }elseif(
$pid=='types'){    
            
$tab = empty($_groups[$mod]['etab']) ? 'types_common' 'types_'.$mod;
            
$ord $fpk 'kid'//不使用 
        
}
        foreach([
'tab','ord','fpk'] as $k0){
            
self::$cfg[$k0] = $$k0;
        }
        return 
self::$cfg;
    }

    
// 得到一笔数据:docs','users','coms','advs','types
    
static function getRow($mod$key$pid=''){
        if(!
$pid){
            
$_groups glbConfig::read('groups');
            
$pid $_groups[$mod]['pid'];
        }
        
$kid $pid=='types' 'kid' substr($pid,0,1).'id';
        
$db glbDBObj::dbObj();
        
$tabid glbDBExt::getTable($mod);
        
$res $db->table($tabid)->where("$kid='{$key}'")->find();
        if(empty(
$res)){
            return array();
        }
        if(
in_array($pid,array('docs'))){
            
$tabid glbDBExt::getTable($mod,1);
            
$dext $db->table($tabid)->where("did='{$key}'")->find();
            
$dext && $res += $dext
        }
        return 
$res;
    }

    static function 
fmtRow($row$mod$opts=array()){
        foreach(
$row as $k => $val){
            if(
$k=='catid'){
                
$row["{$k}Name"] = vopCell::cOpt($val$mod',');
            }
            if(
$k=='mpic'){ // cPic($val,$def='',$resize=0)
                
$resize = isset($opts['mpic_resize']) ? $opts['mpic_resize'] : 0;
                
$mpic vopCell::cPic($val''$resize);
                
$row["mpic"] = self::fmtUrl($mpic);
            }
            if(
in_array($k,['atime','etime'])){
                
$row["{$k}Str"] = vopCell::cTime($val);
            }
            if(
$k=='detail'){
                
$row["detail"] = basStr::filHWap($row["detail"]);
            }
            if(!empty(
$opts[$k])){
                
$cfg $opts[$k];
                
$mod = empty($cfg['mod']) ? $mod $cfg['mod'];
                if(
$cfg['type']=='cOpt'){
                    
$row["{$k}Name"] = vopCell::cOpt($val$cfg['mod'], ',');
                }
                if(
$cfg['type']=='cTime'){
                    
$fmt = empty($cfg['fmt']) ? 'auto' $cfg['fmt'];
                    
$row["{$k}Name"] = vopCell::cTime($val$fmt);
                }
            }
        }
        return 
$row;
    }
    static function 
fmtList($list$mod$opts=array()){
        foreach(
$list as $k => $row){
            
$list[$k] = self::fmtRow($row$mod$opts);
        }
        return 
$list;
    }
    static function 
fmtUrl($url){
        if(!
$url) return '';
        global 
$_cbase;
        
$rc $_cbase['run'];
        return 
$rc['iss'].':'.$rc['rsite'].$url;
    }

}