<?php
namespace imcat;

// Store存储类
class comStore{    

    public static 
$objs = array();
    public static 
$cfgs = array();

    static function 
storeCfgs(){
        if(empty(
self::$cfgs)){
            
$scfg = glbConfig::read('store', 'ex');
            
self::$cfgs = $scfg;
        }
    }

    
// 移动:从临时文件到正式附件地址 $cls::method(); 在php5.2下报错
    
static function moveUres($org, $obj, $fmove=1){
        
self::storeCfgs();
        
$clsName = self::rsType($obj);
        
$cfg = self::$cfgs['types'][$clsName];
        if(
$fmove){
            
$rsObj = self::rsCobj($clsName);
            
$re0 = $rsObj->moveUres($org, $obj, $fmove); 
        }
        return 
$cfg['spre'].$obj.$cfg['sfix'];
    }
    
// 删除:删除id下的附件资源
    
static function delFiles($mod, $kid){
        if(empty(
$kid)){ return; }
        
$dir = comStore::getResDir($mod, $kid, 0); 
        
$re = comFiles::delDir(DIR_URES.'/'.$dir, 1);
        
$tabs = self::rsType($dir); 
        foreach(
$tabs as $cls=>$cfg) {
            
$rsObj = self::rsCobj($cls);
            
$re = $rsObj->delFiles($dir);
        } 
        return 
$re;
    } 
    static function 
rsType($fpdir){
        
// news/2018/9k-dj1t/2018-9k-dj41.jpg 
        // news/2018/9k-dj1t/2018-9k-dj41
        
self::storeCfgs();
        
$clsName = 'rsLocal'; // default
        
$tmp = explode('/', $fpdir);
        
$dfix = $tmp[0].'/';
        if(
strpos($fpdir,'.')>0){
            
$ticon = comFiles::getTIcon($fpdir); // type,icon
            
$ftype = $ticon['type'];
            foreach(
self::$cfgs['types'] as $cls=>$cfg) {
                
$indir = empty($cfg['mdirs']) || in_array($dfix,$cfg['mdirs']);
                
$intype = empty($cfg['ftypes']) || in_array($ftype,$cfg['ftypes']);
                if(
$indir && $intype){
                    return 
$cls;
                }
            }
            return 
$clsName;
        }else{
            
$res = array();
            foreach(
self::$cfgs['types'] as $cls=>$cfg) {
                if(empty(
$cfg['mdirs']) || in_array($dfix,$cfg['mdirs'])){
                    
$res[$cls] = $cfg;
                }
            }
            return empty(
$res) ? $clsName : $res;
        }
    }
    static function 
rsCobj($fname){
        if(empty(
self::$objs[$fname])){
            require_once 
DIR_IMCAT."/adpt/store/$fname.php";
            
$class = "\\imcat\\$fname";
            
self::$objs[$fname] = new $class();
        }
        return 
self::$objs[$fname];
    }

    
/**
     * 上传到的临时目录,后续再移动到正式目录
     * @return string
     */
    
static function getTmpDir($isfull=1){
        
$user = usrBase::userObj();
        
$sid = empty($user->sinit['sid']) ? usrPerm::getUniqueid('Cook','sip') : $user->sinit['sid'];
        
$path = "@udoc/$sid"; //$modFix-
        
comFiles::chkDirs($path, 'dtmp', 0);
        return (
$isfull ? DIR_DTMP.'/' : '')."$path"; //PATH_ROOT
    
}
    
    static function 
fixTmpDir($path){
        
$pos = strpos($path,"/@udoc/");
        
$path = PATH_DTMP.substr($path, $pos);
        return 
$path;
    }
    
    
/**
     * 上传资源目录
     * @return string
     */
    
static function getResDir($mod, $kid, $isfull=1, $chkdir=0){
        
$grs = glbConfig::read('groups'); 
        
$mcfgs = empty($grs[$mod]) ? array() : $grs[$mod];
        if(empty(
$kid)){
            die(
__FUNCTION__);
        }
        
$kpath = $kid; 
        
$fmts = glbConfig::read('frame.resfmt', 'sy'); // docs,users; types; advs,coms 
        
$fmt = (!empty($mcfgs['pid']) && in_array($mcfgs['pid'],array('docs','users'))) ? 1 : 0;
        foreach(
$fmts as $k=>$v){ // 默认:fmt=1 : yyyy/md-noid
            
if(in_array($mod,$v)){ $fmt=$k; break; }
        }
        if(!empty(
$fmt) && strpos($kid,'-')>0){ 
            
$ka = explode('-',$kid);
            if(
$fmt==1) $kpath = $ka[0].'/'.$ka[1].(empty($ka[2])?'':'-'.$ka[2]);
            if(
$fmt==2) $kpath = $ka[0].'-'.$ka[1].(empty($ka[2])?'':'/'.$ka[2]);
            if(
$fmt==3) $kpath = $ka[0].'/'.$ka[1].(empty($ka[2])?'':'/'.$ka[2]);
            if(
$fmt==6){ // /html/news-16/ab-8899.html
                
$repath = "$mod-".substr($kpath,2,2)."/".substr($kpath,5);
            }else{
                
$repath = "$mod/$kpath"; 
            }
        }else{
            
$repath = "$mod/$kpath"; //empty($kpath);
        
}
        
$chkdir && comFiles::chkDirs($repath, 'ures', 0);
        return (
$isfull ? DIR_URES.'/' : '').$repath;
    }
    
// 移动一个字段的附件文件:comStore::moveTmpField($dop,'exp_t01');
    
static function moveTmpField(&$dop, $fid, $mod, $did, $ishtml=0){
        if(!
strpos($dop->fmv[$fid],'/@udoc/')){ return; }
        
$dop->fmv[$fid] = self::moveTmpDir($dop->fmv[$fid], $mod, $did, $ishtml); 
    }
    
//移动临时文件夹中的文件
    
static function moveTmpDir($str, $mod, $kid, $ishtml=0){
        
self::storeCfgs();
        
$ar2 = self::moveTmpFmt($str, $ishtml); 
        if(empty(
$ar2)) return $str;
        foreach(
$ar2 as $v){
            if(
self::moveTmpOne($str, $v, $mod, $kid)) continue;
            
$cfg = array(
                array(
'ures', "/$mod"), 
                array(
'html', "/$mod"),
                array(
'static', "/"), 
                array(
'root', "/"),
            );
            foreach(
$cfg as $cv){
                
$str = self::moveRepRoot($str, $v, $cv[0], $cv[1]);
            }
        }
        foreach(
self::$cfgs['types'] as $tk=>$row){
            if(!empty(
$row['vpre']) && !empty($row['spre']) && strpos($str,$row['vpre'])>=0){
                
$str = str_replace($row['vpre'], $row['spre'], $str);
            } 
        }
        return 
$str;
    }
    
// deel:@udoc
    
static function moveTmpOne(&$str, $v, $mod, $kid){
        global 
$_cbase;
        
$fix = PATH_DTMP."/@udoc/";
        
$flag = 0;
        if(
$org=strstr($v,$fix)){
            
$orgfile = DIR_DTMP.substr($org, strlen(PATH_DTMP));
            
$obj = self::getResDir($mod,$kid,0,1)."/".basename($org);
            
// 可能:mpic,content:有同一个图片,第一次移动后,第二次就不存在了,所以也要替换
            
$fmove = is_file($orgfile);
            
$rmove = self::moveUres($orgfile, $obj, $fmove);
            
$str = str_replace($v, $rmove, $str);
            
$flag = 1; 
            
/*
            if(in_array($org,$_cbase['run']['tmpFile'])){
                $str = str_replace($v, '{uresroot}/'.$obj, $str);
                $flag = 1; 
            }elseif(is_file($orgfile)){ 
                if($re=self::moveUres($orgfile,$obj)){
                    $str = str_replace($v, '{uresroot}/'.$obj, $str);
                    $_cbase['run']['tmpFile'][] = $org;
                    $flag = 1; 
                }
            }*/
        
}
        return 
$flag;
    }
    
// str2arr
    
static function moveTmpFmt($str, $ishtml=0){
        if(
$ishtml){ //a,img,embed,value?,
            
preg_match_all("/\s+(src|href|value)=(\S+)[\s|>]+/i", $str, $arr); //3
            
$ar2 = empty($arr[2]) ? array() : str_replace(array("\\",'"',"'"), array(), $arr[2]); 
        }else{
            if(
strpos($str,';')){ //pics
                
$ar2 = explode(';', $str);
                foreach(
$ar2 as $k=>$v){
                    
$art = explode(',', $v);
                    if(empty(
$art[0])) unset($ar2[$k]);
                    else 
$ar2[$k] = str_replace(array("\r","\n",' '), array('','',''), $ar2[$k]);
                }
            }else{
                
$ar2 = array($str);
            }
        } 
        
$ar2 = array_unique(array_filter($ar2));
        return 
$ar2;
    }
    
    
//替换root路径
    
static function moveRepRoot($str, $v, $key, $fix=''){
        global 
$_cbase;
        
$rmain = $_cbase['run']['rmain'];
        
$cfg = self::cfgDirPath($key, 'arr');
        
$res = $v;
        if(
strpos($res,$cfg[1].$fix)===0 && !empty($cfg[1])){
            
$res = '{'.$key.'root}'.substr($res, strlen($cfg[1]));
            
//echo "$key, ($v, $res, $str)<br>";
            
$str = str_replace($v, $res, $str); 
        }
        
$reps = glbConfig::read('repath', 'sy');
        foreach (array(
'att','tpl') as $k0) {
            if(!empty(
$reps[$k0])){
                
$str = str_replace(array_values($reps[$k0]), array_keys($reps[$k0]), $str);
            }
        }
        
//$str = self::revSaveDir($str); # 2009-02之前就有这行代码???
        
return $str;
    }
    
    
//part:dir,arr,else
    
static function cfgDirPath($key, $part='dir'){
        
$cfg = array(
            
'root'   => array(DIR_ROOT,    PATH_ROOT),
            
'imcat'  => array(DIR_IMCAT,   PATH_IMCAT),
            
'views'  => array(DIR_VIEWS,   PATH_VIEWS),
            
'ctpl'   => array(DIR_CTPL,    ''),
            
'dtmp'   => array(DIR_DTMP,    PATH_DTMP),
            
'vars'   => array(DIR_VARS,    PATH_VARS),
            
'ures'   => array(DIR_URES,    PATH_URES),
            
'html'   => array(DIR_HTML,    PATH_HTML),
            
'vendor' => array(DIR_VENDOR,  PATH_VENDOR),
            
'vendui' => array(DIR_VENDUI,  PATH_VENDUI),
            
'static' => array(DIR_STATIC,  PATH_STATIC),
            
'tpl'    => array(vopTpls::path('tpl'), ''), //可能没有定义
            
'tpc'    => array(vopTpls::path('tpc'), ''),
        );
        
$re = isset($cfg[$key]) ? $cfg[$key] : $cfg;
        if(
$part=='arr') return $re;
        
$id = $part=='dir' ? 0 : 1;
        return empty(
$re[$id]) ? $key : $re[$id];
    }
    
    
//还原保存的路径
    
static function revSaveDir($str, $part=''){
        
self::storeCfgs();
        
$paths = self::cfgDirPath(0, 'arr');
        foreach(
$paths as $ck=>$itm){
            if(
in_array($ck,array('tpl','tpc','ctpl','code'))) continue;
            
$path = $part=='dir' ? $itm[0] : $itm[1];
            
$str = str_replace(array('{'.$ck.'root}','{$'.$ck.'root}'), $path, $str); 
        }
        
$reps = glbConfig::read('repath', 'sy');
        foreach (array(
'att','tpl') as $k0) {
            if(!empty(
$reps[$k0])){
                
$str = str_replace(array_keys($reps[$k0]), array_values($reps[$k0]), $str);
            }
        }
        foreach(
self::$cfgs['types'] as $tk=>$row){ // && strpos($str,$row['spre'])>=0
            
if(!empty($row['vpre']) && !empty($row['spre'])){
                
$str = str_replace($row['spre'], $row['vpre'], $str); 
            }
        }
        return 
$str;
    }
    
// 图片集转数组: dext:del-ext
    
static function picsTab($exfile, $dext=1){ 
        if(empty(
$exfile)) return [];
        
$exfile = str_replace(["\r\n","\r"], ["\n","\n"], $exfile);
        
$exfps = explode("\n", self::revSaveDir($exfile));
        if(empty(
$exfps)){ return []; }
        foreach(
$exfps as $fk=>$fp){
            
$fp = trim(str_replace(';','',$fp));
            if(!
$fp){ unset($exfps[$fk]); }
            else{ 
                
$msg = '';
                if(
strpos($fp,',')>0){ 
                    
$tmp = explode(',', $fp);
                    
$fp = $tmp[0]; //substr($fp,0,strpos($fp,',')); 
                    
$msg = $tmp[1];
                }
                
$exfps[$fk] = $dext ? $fp : [$fp,$msg]; 
            }
        }
        return 
$exfps;
    }
    
}