<?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>1 ?$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>1 ? $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($res, self::$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, $where, self::$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;
    }

}