<?php
namespace model;

(!defined('TAGS_TYPE')) && define('TAGS_TYPE',[
	'factory','area','country','make','series','_model','model','pro','number','_number','_promodel', 'promodel', 'code','poe','poesup','prosup','pic'
]);

use \model;
/**
 * Class tags
 * @package model
 */
class tags extends model
{
	public $table = 'tags';
	public $key = 't_id';
	public $name = LG_NAME;
    
	/**
	  * @method 获取标签
	  * @param  $tids [选填]
	  * @author soul
	  */
	public function getTags($tids = [])
	{
		$where = ['ORDER'=>'t_seq'];
		if(!empty($tids))
		{
			$where['t_id'] = $tids;
		}
		$toArr = ['t_id'];
		$toArr = langFields($toArr,'');
		return $this->db->select('tags',$toArr, $where);
	}

	/**
	  * @method 获取object的标签
	  * @param  $tagType [必填] 标签类型
	  * @author hongzhang
	  */
	public function getObjTags($tagType, $mode = '')
	{
		$where = ['ORDER'=>['o_sort','o_id']];
		$where['o_parent_id'] = \mvc::$cfg['objTagTypes'][$tagType];
		$toArr = ['o_id'];
		$toArr = langFields($toArr,'');
		$arr = $this->db->select('object',$toArr, $where);
		foreach($arr as &$v){
			$v['key'] = $v['o_id'];
			$v['value'] = $v[LG_NAME];
		}
		if($mode == 'search'){
			array_unshift($arr, ['key'=>'','value'=>'']);
		}
		return $arr;
	}

	/**
	  * @method 获取标签ID
	  * @param  $nameArr [选填]
	  * @author soul
	  */
	public function getTidsByName($nameArr)
	{	
		$orArr = [];
		foreach(\mvc::$cfg['LANGS'] as $lk=>$lv){
			$orArr[$lv['field']] = $nameArr;
		}
		$where = [
			"OR" => $orArr,
			'ORDER'=>'t_seq'
		];
		return $this->db->select('tags', 't_id', $where);
	}


	/**
	  * @method 获取标签ID
	  * @param  $names [必填] TECDOC,询单系统,北美,目录排版 
	  * @author soul
	  */
	public function getTidsStrByNames($names)
	{
		$reArr = ['/'=>',', ';'=>','];
		$names = strtr($names, $reArr);
		$rows = $this->getTidsByName(explode(',', $names));
		return implode(',', $rows);
	}


	
	/**
	  * @method 获取某类型的数据标签
	  * @param  $type string [必填] TAGS_TYPE 中的值s
	  * @param  $valIdArr string [必填] 对应的数据值
	  * @author soul
	  */
	public function getTypeValTags($type, $valIdArr)
	{
		$this->checkExists($type);
		$verArr = [];
		if(is_array($valIdArr) && !empty($valIdArr))
		{
			$verArr = $this->db->select('tags_link', ['tl_value_id', 'tl_t_id'],  ['tl_type'=>$type,'tl_value_id'=>$valIdArr]);
			if(!empty($verArr))
			{
				$tags = new tags();
				$tlTags = $tags->getYhTidTags(array_column($verArr, 'tl_t_id'));
				$tlTags = array_column($tlTags, 'tags', 'tl_t_id');
				foreach($verArr as &$v)
				{
					$v['tags'] = empty($tlTags[$v['tl_t_id']])? []: $tlTags[$v['tl_t_id']];
				}
			}
		}
		return $verArr;
	}



    /**
	  * @method 是否存在某标签
	  */
	public function exists($type)
	{
		return in_array($type,TAGS_TYPE);
	}
    /**
	  * @method 不存在某标签，抛出错误
	  */
	public function checkExists($type)
	{
		if(!$this->exists($type)){
			throw new \Exception( lg('无效的标签类型') .': '. $type );
		}
	}

	
	/**
	  * @method 批量获取异或值对应的标签
	  * @param  $tlTid int|array [必填] 1 或者 [1,6...]
	  * @author soul
	  */
	public function getYhTidTags($orgTlTid)
	{
		$arr = [];
		$tlTidArr = is_array($orgTlTid) ? array_unique($orgTlTid): [$orgTlTid];
		if(!empty($tlTidArr))
		{
			$tagsArr = $this->getTags();
			foreach($tlTidArr as $tlTid)
			{
				$row = ['tl_t_id'=>$tlTid, 'tags'=>[]];
				$tidArr = explodeXor($tlTid);
				foreach($tagsArr as $t)
				{
					if(in_array($t['t_id'], $tidArr)) 
						$row['tags'][] = $t;
				}
				$arr[] = $row;
			}
		}
		//传的是非数组
		if(!is_array($orgTlTid) && !empty($arr)) 
			$arr = $arr[0]['tags'];
		return $arr;
	}

	
	/**
	  * @method 变更某源的标签
	  * @param  $type string [必填] TAGS_TYPE 中的值s
	  * @param  $actType string [必填] add:只增加  del:只删除 replace:替换
	  * @param  $dataArr array [必填] 
				单个 ['t_id'=>[1,2,3,4]（string|array actType=replace空表示删除）, 'value_id'=>11]
				批量 [['t_id'=>[1,2,3,4]（string|array actType=replace空表示删除）, 'value_id'=>11],...]
	  * @author soul
	  */
	public function changeTagsLink($type, $actType, $dataArr)
	{
        $this->checkExists($type);
		if(is_array($dataArr) && !empty($dataArr))
		{
			if(!empty($dataArr['value_id'])) $dataArr = [$dataArr];
			$valids = array_unique(array_column($dataArr, 'value_id'));
			$where = [
				'tl_type'=>$type,
				'tl_value_id'=>$valids,
			];
			
			$hasArr = [];
			if($rows = $this->db->select('tags_link', ['tl_t_id', 'tl_value_id'], $where))
			    $hasArr = array_column($rows, 'tl_t_id', 'tl_value_id');
			
			$newArr = [];
			foreach($dataArr as $v)
			{
				if(!isset($v['value_id']) || !isset($v['t_id'])) continue;
				if(isset($v['t_id']) && !is_array($v['t_id']) ) $v['t_id'] = explode(',', $v['t_id']);
				$newArr[$v['value_id']] = [];
				foreach($v['t_id'] as $tid)
				{
					if($tid > 0)
						$newArr[$v['value_id']][] = $tid;
				}
			}
			$this->db->Begin();
			
			if($type == 'promodel')
				$pids = $this->db->select('pro_model_link', 'pml_p_id', ['pml_id'=>$valids]);
			if($type == 'number')
				$pids = $this->db->select('pro_numidx', 'pn_p_id', ['pn_id'=>$valids]);
			if($type == 'pro')
				$pids = $valids;
			if(!empty($pids) )
			{	
				if($type!='poe')
				{
					$upcode = [
						'p_opuser'=>getOpuser(),
						'p_update_time'=>getNowTime(),
					];
					$this->db->update('pro', $upcode, ['p_id'=>$pids]);
				}else{
					$upcode = [
						'oe_opuser'=>getOpuser(),
						'oe_update_time'=>getNowTime(),
					];
					$this->db->update('oe_item', $upcode, ['oe_id'=>$pids]);
				}
				
			}

			//变更数据标签
			

			switch($actType)
			{
				case 'add':
					foreach($newArr as $valid=>$tidArr)
					{
						if(!empty($hasArr[$valid]))
						{
							$tl_t_id = addXor($tidArr, $hasArr[$valid]);
							if($tl_t_id > 0)
								$this->db->update('tags_link', ['tl_t_id'=>$tl_t_id], ['tl_type'=>$type, 'tl_value_id'=>$valid]);
							else
								$this->db->delete('tags_link', ['tl_type'=>$type, 'tl_value_id'=>$valid]);
						}
						else
						{
							$add = [
								'tl_type'=>$type,
								'tl_t_id'=>addXor($tidArr, 0),
								'tl_value_id'=>$valid
							];
							if($add['tl_t_id'] > 0) $this->db->insert('tags_link', $add);
						}
						if($type=='pro')
						{
							$olds =[];
							$news = $this->db->get('tags',['cn_names'=>raw("GROUP_CONCAT(cn_name)")],['t_id'=>$tidArr]);
							if($hasArr[$valid]){
								$olds = $this->db->get('tags',['cn_names'=>raw("GROUP_CONCAT(cn_name)")],['t_id'=>explodeXor($hasArr[$valid])]);
							}

							$changeArr[$valid][] = ['field'=>'tags','name'=>'数据标签','new'=>$news['cn_names']??'','old'=>$olds['cn_names']??''];
						}
						
					}
				break;
				case 'del':
					foreach($newArr as $valid=>$tidArr)
					{
						if(!empty($hasArr[$valid]))
						{
							$tl_t_id = deleteXor($tidArr, $hasArr[$valid]);
							if($tl_t_id > 0)
								$this->db->update('tags_link', ['tl_t_id'=>$tl_t_id], ['tl_type'=>$type, 'tl_value_id'=>$valid]);
							else
								$this->db->delete('tags_link', ['tl_type'=>$type, 'tl_value_id'=>$valid]);
						}
						if($type=='pro')
						{
							$olds =[];
							$news = $this->db->get('tags',['cn_names'=>raw("GROUP_CONCAT(cn_name)")],['t_id'=>$tidArr]);
							if($hasArr[$valid]){
								$olds = $this->db->get('tags',['cn_names'=>raw("GROUP_CONCAT(cn_name)")],['t_id'=>explodeXor($hasArr[$valid])]);
							}

							$changeArr[$valid][] = ['field'=>'tags','name'=>'数据标签','new'=>$news['cn_names']??'','old'=>$olds['cn_names']??''];
						}
					}
				break;
				case 'replace':
					foreach($newArr as $valid=>$tidArr)
					{
						$tl_t_id = addXor($tidArr, 0);
						if($tl_t_id < 1)
						{
							unset($newArr[$valid]);
							continue;
						}
						if(!empty($hasArr[$valid]))
						{
							$this->db->update('tags_link', ['tl_t_id'=>$tl_t_id], ['tl_type'=>$type, 'tl_value_id'=>$valid]);
						}
						else
						{
							$add = [
								'tl_type'=>$type,
								'tl_t_id'=>$tl_t_id,
								'tl_value_id'=>$valid
							];
							$this->db->insert('tags_link', $add);
						}

						if($type=='pro')
						{
							$olds =[];
							$news = $this->db->get('tags',['cn_names'=>raw("GROUP_CONCAT(cn_name)")],['t_id'=>$tidArr]);
							if($hasArr[$valid]){
								
								$olds = $this->db->get('tags',['cn_names'=>raw("GROUP_CONCAT(cn_name)")],['t_id'=>explodeXor($hasArr[$valid])]);
							}

							$changeArr[$valid][] = ['field'=>'tags','name'=>'数据标签','new'=>$news['cn_names']??'','old'=>$olds['cn_names']??''];
						}
					}
					$delValIdArr = array_diff(array_keys($hasArr), array_keys($newArr));
					if(!empty($delValIdArr))
						$this->db->delete('tags_link', ['tl_type'=>$type, 'tl_value_id'=>$delValIdArr]);
				break;
			}
			if($type=='pro' && $changeArr){
				foreach ($changeArr as $pid => $arr) {
				
					$logdata[] = [
						'cl_type'=>'pro',
						'cl_act'=>'edit',
						'cl_dataid'=>$pid,
						'cl_change'=>json_encode(['tags'=>$arr], JSON_UNESCAPED_UNICODE),
						'cl_opuser'=>getOpuser(),
						'cl_create_time'=>getNowTime(),
					];
				}
				if($logdata) $this->db->insert('change_log',$logdata);
			}
			$this->db->End();
		}
		return [];
	}

	/**
	  * @method 变更某源的标签obj
	  * @param  $type string [必填] TAGS_TYPE 中的值s
	  * @param  $actType string [必填] add:只增加  del:只删除 replace:替换
	  * @param  $dataArr array [必填] 
				单个 ['t_id'=>[1,2,3,4]（string|array actType=replace空表示删除）, 'value_id'=>11]
				批量 [['t_id'=>[1,2,3,4]（string|array actType=replace空表示删除）, 'value_id'=>11],...]
	  * @author hongzhang
	  */
	public function changeObjTagsLink($table,$type, $actType, $dataArr){
		$this->checkExists($type);
		if(is_array($dataArr) && !empty($dataArr)){
			if(!empty($dataArr['value_id'])) $dataArr = [$dataArr];
			$valids = array_unique(array_column($dataArr, 'value_id'));
			$where = [
				'otl_table'=>$table,
				'otl_type'=>$type,
				'otl_val_id'=>$valids,
			];

			$hasArr = [];
			if($rows = $this->db->select('object_tags_link', ['otl_o_id', 'otl_val_id'], $where))
				foreach($rows as $v){
					$hasArr[$v['otl_val_id']][] = $v['otl_o_id'];
				}
			
			$newArr = [];
			foreach($dataArr as $v)
			{
				if(!isset($v['value_id']) || !isset($v['t_id'])) continue;
				if(isset($v['t_id']) && !is_array($v['t_id']) ) $v['t_id'] = explode(',', $v['t_id']);
				$newArr[$v['value_id']] = [];
				foreach($v['t_id'] as $tid)
				{
					if($tid > 0)
						$newArr[$v['value_id']][] = $tid;
				}
			}
			
			$this->db->Begin();
			// 更新相关数据表格的操作字段
			if($table == 'cate'){
				if($type == 'pic'){
					$upcode = [
						'pcf_opuser'=>getOpuser(),
						'pcf_update_time'=>getNowTime(),
					];
					$this->db->update('pro_cate_file', $upcode, ['pcf_fileid'=>$valids]);
				}
			}

			if($table == 'pro'){
				if($type == 'pic'){
					$upcode = [
						'pic_opuser'=>getOpuser(),
						'pic_update_time'=>getNowTime(),
					];
					$this->db->update('pro_pic', $upcode, ['pic_fileid'=>$valids]);
				}
			}

			switch($actType){
				case 'add':
					foreach($newArr as $valid=>$tidArr){
						if(!empty($hasArr[$valid])){
							$tl_t_ids = array_diff($tidArr, $hasArr[$valid]);
							if(count($tl_t_ids) > 0){
								$add = [];
								foreach($tl_t_ids as $tl_t_id){
									$add[] = [
										'otl_table'=>$table,
										'otl_type'=>$type,
										'otl_o_id'=>$tl_t_id,
										'otl_val_id'=>$valid
									];		
								}
								if($add) $this->db->insert('object_tags_link', $add);
							}
						}else{
							$add = [];
							foreach($tidArr as $tl_t_id){
								$add[] = [
									'otl_table'=>$table,
									'otl_type'=>$type,
									'otl_o_id'=>$tl_t_id,
									'otl_val_id'=>$valid
								];		
							}
							if($add) $this->db->insert('object_tags_link', $add);
						}
					}
					break;
				case 'del':
					foreach($newArr as $valid=>$tidArr){
						if(!empty($hasArr[$valid]))
						{
							$tl_t_ids = array_intersect($tidArr, $hasArr[$valid]);
							if(count($tl_t_ids) > 0)
								$this->db->delete('object_tags_link', ['otl_table'=>$table,'otl_type'=>$type, 'otl_val_id'=>$valid, 'otl_o_id'=>$tl_t_ids]);
						}
					}
					break;
				case 'replace':
					foreach($newArr as $valid=>$tidArr){
						if(!empty($hasArr[$valid])){
							$add_t_ids = array_diff($tidArr,$hasArr[$valid]);
							$del_t_ids = array_diff($hasArr[$valid],$tidArr);
							if(count($add_t_ids) > 0){
								$add = [];
								foreach($add_t_ids as $tl_t_id){
									$add[] = [
										'otl_table'=>$table,
										'otl_type'=>$type,
										'otl_o_id'=>$tl_t_id,
										'otl_val_id'=>$valid
									];		
								}
								if($add) $this->db->insert('object_tags_link', $add);
							}
							if(count($del_t_ids) > 0)
								$this->db->delete('object_tags_link', ['otl_table'=>$table,'otl_type'=>$type, 'otl_val_id'=>$valid, 'otl_o_id'=>$del_t_ids]);
						}
						else{
							$add = [];
							foreach($tidArr as $tl_t_id){
								$add[] = [
									'otl_table'=>$table,
									'otl_type'=>$type,
									'otl_o_id'=>$tl_t_id,
									'otl_val_id'=>$valid
								];		
							}
							if($add) $this->db->insert('object_tags_link', $add);	
						}
					}
					$delValIdArr = array_diff(array_keys($hasArr), array_keys($newArr));
					if(!empty($delValIdArr))
						$this->db->delete('object_tags_link', ['otl_table'=>$table,'otl_type'=>$type, 'otl_val_id'=>$delValIdArr]);
					break;
			}
			$this->db->End();
		}
		return [];
	}
	/**
	  * @method 添加一条数据标签记录
	  * @param  $type string [必填] TAGS_TYPE 中的值s
	  * @param  $key string [必填] 主键值
	  * @param  $link_tags array|string [必填]  1,2,8 或者 [1,2,3] 
	  */
    function setOneToTags($type, $key,$link_tags){
		$this->checkExists($type);
        if($key>0){
			$this->changeTagsLink($type, 'replace', ['t_id'=>$link_tags, 'value_id'=>$key]);
            return true;
        }else{
            return false;
        }
    }

	
	/**
	  * @method 获取一条数据标签记录
	  * @param  $type string [必填] TAGS_TYPE 中的值s
	  * @param  $key string [必填] 主键值
	  */
    function getOneTag($type, $key){
		$this->checkExists($type);
        return $this->db->get('tags_link','tl_t_id', ['tl_type'=>$type, 'tl_value_id'=>$key]);
    }

}
