<?php
namespace imcat;

class 
extHaoft{

    public 
$skcfg = array();
    public 
$db null;

    public 
$city '';
    public 
$run ''// 运行模式: cmd-命令行, web-浏览器

    
public $types = array('sale''lease''dept''user''comp');
    public 
$type '';

    public 
$fields = array();

    function 
__construct($city){
        
// 检查城市
        
$cfgs read('haoft','ex'); 
        if(empty(
$city) || !isset($cfgs[$city])){
            die(
'`city($city)` Error!');
        }else{
            
$this->city $city;
            
$this->skcfg $cfgs[$city];
            
$this->db db($cfgs['db-key']);
        }
        
// 运行模式
        
$this->run req('run''web'); // cmd, web
        
$this->fields $cfgs['db-fields'];
        
comHttp::setCache(3);
    }

    public function 
syncData($type){
        
// 检查类型
        
if(!$type || !in_array($type,$this->types)){
            die(
'`type($this->type)` Error!');
        }
        
$this->type $type
        
// getData
        
$last $this->apiLast(); // 获取last,兼容 cmd, web
        
$url $this->apiUrl($last);
        
$data comHttp::doGet($url); //dump("$url\n$data");
        // deelData
        
$earr json_decode($data,1); 
        
$res $earr; unset($res['DATA']);
        
$res['nadd'] = $res['nupd'] = $res['nskip'] = $res['nok'] = $res['nbad'] = 0;
        if(!empty(
$earr['ERRCODE'])){
            die(
'('.$earr['ERRCODE'].')'.$earr['ERRMSG'].'@'.$type);
        }
        if(!empty(
$earr['DATA'])){
            foreach(
$earr['DATA'] as $row){
                
$row['city'] = $this->city;
                
$this->updRow($row,$res);
            }
        }
        
// next-判断分析
        
if(in_array($type,array('sale','lease'))){
            
$rlast $res["LAST_TIME_".strtoupper($type)];
            
$rnext $res["NEXT_TIME_".strtoupper($type)];
            if(!(
$rlast==$rnext && empty($res['TOTAL']))){
                
$last str_replace(' ','%20',$rnext);
                
$res['nextUrl'] = "?city={$this->city}&type={$type}&run={$this->run}&last=$last";
            }
            if(
$this->run=='cmd' && !empty($rnext)){
                
$this->apiLast($rnext); // 保存
            
}    
        }
        
// debug-start
        
return $res;
    }
    public function 
updRow($row,&$res){
        
$table $this->type;
        
$kid strtoupper($this->type)."_ID";
        
$kval $row[$kid];
        
$old $this->db->table($table)->where("$kid='$kval'")->find();
        
$rdb null
        
$isrs in_array($this->type,array('sale','lease')); // 租售
        
if(empty($old)){
            
$act 'nadd'
            
$data $this->rowFields($row$table);
            
$rdb $this->db->table($table)->data($data)->insert(0);
            if(
$isrs){
                
$data $this->rowFields($row$table.'info');
                
$this->db->table($table.'info')->data($data)->insert(0);
            } 
        }elseif(
$isrs && $old['UPDATE_TIME'].'.999'<$row['UPDATE_TIME']){
            
$act 'nupd';
            unset(
$row[$kid]);
            
$data $this->rowFields($row$table);
            
$rdb $this->db->table($table)->data($data)->update(0);
            if(
in_array($this->type,array('sale','lease'))){
                
$data $this->rowFields($row$table.'info');
                
$this->db->table($table.'info')->where("$kid='$kval'")->data($data)->update(0);
            }
        }else{
            
$act 'nskip'
        }
        
$res[$act]++;
        
$key $rdb 'nok' 'nbad';
        
$res[$key]++;
        
// debug-start
    
}

    
// 单个表一行数据
    
public function rowFields($row$tab){
        
$fields $this->fields[$tab];
        
$res = array();
        foreach (
$row as $key=>$val) {
            if(
strpos($fields,$key)){
                
$res[$key] = in($val);
            }
        }
        if(
in_array($tab,array('sale','lease')) && $res['BUILD_ID']<0){
            
$res['BUILD_ID'] = 0;
        }
        return 
$res;
    }

    
// 
    
public function apiLast($last=''){
        
$logkey "{$this->city}_{$this->type}";
        if(
$last=='clear'){ // clear-1
            
$this->db->table('cache')->where("kid='$logkey'")->delete();
        }elseif(!empty(
$last)){ // save
            
$data = array('kid'=>$logkey,'val'=>$last);
            
$this->db->table('cache')->data($data)->replace();
        }elseif(
$this->run=='cmd'){ // read
            
$row $this->db->table('cache')->where("kid='$logkey'")->find();
            
$last $row $row['val'] : '2015-01-01'
        }else{ 
// web 下使用
            
$last req('last''2015-01-01'); // 2015-01-01 / 2017-05-18%2019:43:53.953
        
}
        return 
$last;
    }
    
    
// type: Sale, Lease, Comp, User, Dept
    
public function apiUrl($last=''){
        
$apiType ucfirst($this->type);
        
$key "LAST_TIME_".strtoupper($this->type);
        if(
in_array($this->type,array('sale','lease'))){
            
$slast "$key=".($last str_replace(' ','%20',$last) : '2015-01-01');
        }else{
            
$slast "_key_=2015-01-01";
        }
        
$url "http://user.haofang.net/hftWebService/web/openApi/data/get{$apiType}List?";
        
$param "COMP_NO={$this->skcfg['ak']}&SYNC_VERIFYID={$this->skcfg['as']}&$slast";
        if(
$apiType=='Comp'){ $url str_replace('List?','Info?',$url); }
        return 
$url.$param;
    }

    
// https://linzhi.haofang.net/sale/
    
public function syncArea(){
        
$city $this->city;
        
$db $this->db;
        
$url "https://$city.haofang.net/sale/";
        
$data comHttp::doGet($url);
        
$data basElm::getPos($data,'<dt>区域:</dt>(*)</dl>');
        
preg_match_all("/\/sale\/a(\w+)\/\"\s*>(\S+)<\/a>/is",$data,$arr);
        
// <a href="https://linzhi.haofang.net/sale/a2466/" >林芝县</a>
        
$res = array();
        if(!empty(
$arr[2])){
            foreach(
$arr[2] as $k1=>$v1){
                
$pid $arr[1][$k1];
                
$res[$k1] = "[{$pid}:$v1]\n";
                
// db-pid=0
                
$row = array('kid'=>$pid,'title'=>$v1,'city'=>$city,'pid'=>0);
                
$whr1 "kid='$pid' "// AND city='$city' 
                
$old $db->table('area')->where($whr1)->find();
                if(empty(
$old)){
                    
$rf $db->table('area')->data($row)->insert(0);
                } 
// db-pid=(end) */
                
$data comHttp::doGet($url."/a$pid"); 
                
$data basElm::getPos($data,array('class="business-list"','</ul>'));
                
preg_match_all("/\/sale\/a(\w+)\-b(\w+)\/\"\s*id=\"b\w+\">(\S+)<\/a>/is",$data,$ar2); 
                
// <a href="https://linzhi.haofang.net/sale/a2467-b22094/"id="b22094">
                
if(!empty($ar2[3])){
                    foreach(
$ar2[3] as $k2=>$v2){
                        
$kid $ar2[2][$k2];
                        
$res[$k1] .= "{$kid}:$v2, ";
                        
// db-sub=0
                        
$row = array('kid'=>$kid,'title'=>$v2,'city'=>$city,'pid'=>$pid);
                        
$whr2 "kid='$kid' "// AND city='$city' 
                        
$old $db->table('area')->where($whr2)->find();
                        if(empty(
$old)){
                            
$rf $db->table('area')->data($row)->insert(0);
                        } 
// db-sub=(end) */
                    
}
                }
            }
        }
        return 
$res
    }

    
// --------------------------------------------

    // 缩略图
    
static function thumb($url$mw$mh$def='demo_error.jpg')
    {
        if(empty(
$url)){
            return 
PATH_STATIC."/icons/basic/$def";
        }
        return 
"$url?x-oss-process=image/resize,m_fill,h_$mw,w_$mh";
        
// return "{$base}_{$mw}x{$mh}$ext";
    
}

    
// 是否开启API self::opend()
    
static function opend()
    {
        
$cfgs read('haoft','ex'); 
        return empty(
$cfgs['api-open']) ? 1;
    }

}