<?php
namespace model;

use \model;
use \model\check;
use \model\collocation;
use \model\carmodel;
use model\pro\cate;
use model\pro\factory;
use model\pro\pro;

class oeModel extends model
{
	public $table = 'oe_model_link';
    public $key = 'oml_id';

	public $cate;
    public $factory;

	public function __construct ()
    {
		parent::__construct();
		$this->cate = new cate();
        $this->factory = new factory();
	}

	public function getDetail($oml_id)
	{
		$data = $this->getList(['oml_id'=>$oml_id]);
		if(empty($data['rows'])) exitJson('记录不存在');
		$arr =$data['rows'][0];
		$arr['oml_para'] = empty($arr['oml_para'])? []:json_decode($arr['oml_para'], true);
		return $arr;
	}

	


	public function delData($idArr)
	{
		if(!empty($idArr)){
			$this->db->Begin();

			$arr = $this->db->select('oe_model_link', 'oml_oe_id',['oml_id'=>$idArr]);
			$arr = array_unique(array_filter($arr));
			$this->db->delete('oe_model_link', ['oml_id'=>$idArr]);

			if($arr){
				$oe = new oe();
				$oe->initTagBrand($arr);	
				$pro = new pro();
				foreach ($arr as $val) {
					$pro->synProByOe($val,['model']);
				}
				
			}
			$this->db->End();
		}
		return [];
	}
	
	public function setCell($kid, $setArr)
	{
		if(!empty($kid) && !empty($setArr))
		{
		
			$old = $this->db->get('oe_model_link', '*', ['oml_id'=>$kid]);
			if(empty($old)) exitJson('记录不存在');

			$this->db->Begin();
			foreach($setArr as $filed=>$val){
				if(stripos($filed, 'oml_') !== 0){
					unset($setArr[$filed]);
					continue;
				}
			}
			if(!empty($setArr)){
				$opuser = getOpuser();
				$datetime = getNowTime();
				$setArr['oml_opuser'] = $opuser;
				$setArr['oml_update_time'] = $datetime;
			
				$this->db->update('oe_model_link', $setArr, ['oml_id'=>$kid]);
			}
			$this->db->End();
		}
		return [];
	}

    public function getModelList($params, $rules = [])
	{
		$filters = $params['filters'];
		$page = $params['page'];
		$pagesize = $params['rows'];
		$sidx = empty($params['sidx'])? '': $params['sidx'];
		$sord = empty($params['sord'])? 'asc': $params['sord'];
		$orderby = $params['orderby']?:'mk_'.LG_NAME.',ms_name,mm_name';
		$table = 'oe_model_link(oml)';
		$fields = ['cat.id(cat_id)', 'pcat.'.cateName().'(pcat_name)', 'cat.'.cateName().'(cat_name)','oi.oe_id', 'oi.oe_oe','mm.mm_id', 'oml.*','au_name'];
		
		$refiled = [
			'mk_name'=>'mk.mk_'.LG_NAME,
			'ms_name'=>'ms.ms_name',
			'mm_name'=>'mm.mm_name',
			'cat_name'=>'cat.'.cateName(),
			'pcat_name'=>'pcat.'.cateName(),
			'oml_opuser'=>'oml.oml_opuser',
			'oml_create_time'=>'oml.oml_create_time',
			'oml_update_time'=>'oml.oml_update_time',
		];
		$this->set('othjoin', []);
		$this->set('sTags', false);
		$this->set('refiled', $refiled);
		$sidx =  strtr($sidx, $refiled);

		$join = [
			"[><]oe_item(oi)" => ["oml.oml_oe_id" => "oe_id"],
			"[><]pro_cate(cat)" => ["oi.oe_cate_id" => "id"],
			"[><]pro_cate(pcat)" => ["cat.parent_id" => "id"],
			"[>]m_model(mm)" => ["oml.oml_mm_id" => "mm_id"],
			"[>]m_series(ms)" => ["mm.mm_ms_id" => "ms_id"],
			"[>]m_make(mk)" => ["mm.mm_mk_id" => "mk_id"],
			"[>]adm_user(au)"=>["mm.opuser"=>'au_id']
		];

		$this->set('carmodel', new carmodel());
        $where = $this->filter2medoo($filters,function(&$field,&$op,&$data){
			$field = strtr( $field, $this->get('refiled'));
			switch ($field) {
				case 'oml_para':
					$field = 'RAW #1';
					$data =  raw("JSON_SEARCH(oml_para,'one','%{$data}%')  IS NOT NULL");
					break;
				case 'year_from':
					$field = 'RAW #2';
					if(!in_array($op,['ne','le','lt','ne','gt','ge'])) $op = 'cn';
                   
					if($op=='cn'){
						$data =  raw(sprintf("CONCAT(mm_year_from, LPAD(mm_month_from, 2, '0')) like '%s%%'",$data));
					}else{
						$op = $this->getMedooOp($op);
						$data =  raw(sprintf("CONCAT(mm_year_from, LPAD(mm_month_from, 2, '0')) %s '%s'",$op,$data));
					}
					break;
				case 'year_to':
					$field = 'RAW #3';
					
					if(!in_array($op,['ne','le','lt','ne','gt','ge'])) $op = 'cn';
		
					if($op=='cn'){
						$data =  raw(sprintf("CONCAT(mm_year_to, LPAD(mm_month_to, 2, '0')) like '%s%%'",$data));
					}else{
						$op = $this->getMedooOp($op);
						$data =  raw(sprintf("CONCAT(mm_year_to, LPAD(mm_month_to, 2, '0')) %s '%s'",$op,$data));
					}
					
					break;
				case 'mk.mk_'.LG_NAME:
					$field = 'RAW #4';
					if($op=='eq'){
						$data =  raw(sprintf("mk_cn_name ='%s' or mk_en_name ='%s' or mk_py_name ='%s'",$data,$data,$data));

					}else{
						$mkname = $op=='cn'?sprintf('%s%%',$data):sprintf('%%%s%%',$data);
						$data =  raw(sprintf("mk_cn_name like '%s' or mk_en_name like '%s' or mk_py_name like '%s'",$mkname,$mkname,$mkname));	
					}
					break;
			}
        });
		$join = array_merge($join, $this->get('othjoin'));
		

		foreach($rules as $filed=>$val)
		{
			if(empty($val)) continue;
			switch($filed)
			{
				case 'numbers':
					foreach($val as $tk=>$tv)
					{
						$val[$tk] = formatNum($tv);
					}
					$where["AND #num"] = [
						"OR" => [
							'oe_oe_format'.($rules['numlike']? '[~]': '') => $val
						]
					];
				break;
				
			}
		}
		$fields = array_unique($fields);

		if(!empty($params['keys'])) $where['oml_id'] = explode(',', $params['keys']);
		if(!empty($params['oml_id'])) $where['oml_id'] = $params['oml_id'];
		if(!empty($params['oe_id'])){
			$where['oml_oe_id'] = $params['oe_id'];
		}
		if(!empty($params['mk_id'])) $where['mk_id'] = $params['mk_id'];
		
		$where['GROUP'] = 'oml_id';
		if($sidx=='year_to')
		{
			$sidx= '';
			$where['ORDER'] = raw(sprintf('CONCAT(mm_year_to, LPAD(mm_month_to, 2, 0)) %s',$sord));
			
		}
		if($sidx=='year_from')
		{
			$sidx= '';
			$where['ORDER'] = raw(sprintf('CONCAT(mm_year_from, LPAD(mm_month_from, 2, 0)) %s',$sord));
		}
		
        $where = $this->listWhere($where,$page,$pagesize,$sidx,$sord,$orderby);
		if($page>0 && $pagesize>0){
			$pages = $this->paging($table,$join, 'oml_id',$where,$page,$pagesize);
			$where["LIMIT"] = [$pages['limit'],$pagesize];
		}
		
        $modArr = $this->db->select($table,$join,$fields, $where);
     
        if(!empty($modArr))
		{
			$modArr = $this->fillProModelTemp($modArr);
		}
		$data = [
			'page'=> $page,
			'total'=> $pages['total'],
			'records' => $pages['records'],
			'rows' => array_values($modArr)
		];
		return $data;
	}


    //初始化对应的数据
	public function fillProModelTemp($modArr)
	{
		if(!empty($modArr))
		{
			
			$carmodel = new carmodel();
			$modInfoArr = $carmodel->getModelInfoByIds(array_column($modArr, 'mm_id'));
			$modInfoArr = array_column($modInfoArr, null, 'mm_id');
			$collocation = new collocation();
			$collArr = $collocation->lrtree->getChilds(13);
			$collArr = array_column($collArr, LG_NAME, 'o_id');

			foreach($modArr as $k=>$v)
			{
				if(!empty($modInfoArr[$v['mm_id']])) 
					$v = array_merge($modInfoArr[$v['mm_id']], $v);
				
				$v['oml_para'] = empty($v['oml_para'])? []:json_decode($v['oml_para'], true);
				$v['captions'] = [
					'oml_from'=>!empty($collArr[$v['oml_from']])? $collArr[$v['oml_from']]: '',
					'oml_opuser'=>$v['au_name']
				];
				$modArr[$k] = $v;
			}
		}
		return $modArr;
	}
    
    /**
	  * @method 新增或者编辑待进入
	  * @param  $oml_id int [必填] 0表示新增
	  * @param  $setArr array [必填] ['pmlt_cate'=>.....]
	  * @author soul
	  */
	public function saveOeModelDetail($oml_id, $setArr)
	{
		$baseArr = $setArr['base'];
		if(empty($baseArr['oml_mm_id'])) exitJson('车型必填');
		//确认产品ID
		if(empty($baseArr['oml_oe_id']))
		{
			$pidArr = $this->db->get('oe_item',['oe_id'], ['oe_oe_format'=>formatNum($baseArr['oe_oe'])]);
			if(empty($pidArr)) exitJson('OE不存在');
			$baseArr['oml_oe_id'] = $pidArr['oe_id'];
		}
        unset($baseArr['oe_oe']);
		//小类
		// $row = $this->db->get('pro', ['p_cate', 'p_innum', 'p_outnum'], ['p_id'=>$baseArr['oml_oe_id']]);
		// if($oml_id > 0)
		// 	if(!\p::catesEdit('F500', $row['p_cate'])) exitJson('无此小类权限');
		// else
		// 	if(!\p::catesAdd('F500', $row['p_cate'])) exitJson('无此小类权限');
        $uniwhere = [
			'oml_oe_id'=>$baseArr['oml_oe_id'],
			'oml_mm_id'=>$baseArr['oml_mm_id'],
			'oml_id[!]'=>$oml_id
		];
        $chk = $this->db->get('oe_model_link', ['oml_id'], $uniwhere);
		if(!empty($chk)){			
			return ['code'=>0, 'table'=>'oe_model_link', 'msg'=>'OE车型库已存在'];
		}
		
		$datetime = getNowTime();
		$opuser = getOpuser();
		$this->db->Begin();
		$baseArr['oml_opuser'] = $opuser;
		$baseArr['oml_update_time'] = $datetime;
		if($oml_id > 0)
		{
			$this->db->update('oe_model_link', $baseArr, ['oml_id'=>$oml_id]);
		}
		else
		{
			$baseArr['oml_create_time'] = $datetime;
			$this->db->insert('oe_model_link', $baseArr);
			$oml_id = $this->db->id();
		}
        
		$this->db->End();
		return ['oml_id'=>$oml_id];
	}

	/**
	 * @method 添加产品的适用车型
	* @param  $p_id  int  [必填] 产品ID
	* @param  $modArr array  [必填] [
		['oml_mm_id'=>11]
	]
	* @author soul
	*/
	public function addOEModel($oe_id, $modArr)
	{
		if(!empty($oe_id) && !empty($modArr))
		{
			$temp = [];
			$opuser = getOpuser();
			$datetime = getNowTime();
			$addArr = [];
			foreach($modArr as $v)
			{
				$v['oml_oe_id'] = $oe_id;
				$v['oml_opuser'] = $opuser;
				$v['oml_create_time'] = $datetime;
				$v['oml_update_time'] = $datetime;
				$temp[$v['oml_mm_id']] = $v;
			}
			$modArr = $temp;
			$rows = $this->db->select('oe_model_link', ['oml_mm_id'], ['oml_oe_id'=>$oe_id]);
			$hasArr = array_column($rows, 'oml_mm_id');
			
			$this->db->Begin();
			foreach($modArr as $mmid=>$row)
			{
				if($row['oml_mm_id'] > 0 && !in_array($row['oml_mm_id'], $hasArr))
				{
					$this->db->insert('oe_model_link', $row);
				}
			}
			$oe = new oe();
			$oe->initTagBrand($oe_id);
			$pro = new pro();
			$pro->synProByOe($oe_id,['model']);
			
			$this->db->End();
		}
		return [];
	}
	

	public function getModIdById($oe_id)
	{
		$rows = $this->db->select('oe_model_link', ['oml_mm_id'], ['oml_oe_id'=>$oe_id]);
		$hasArr = array_column($rows, 'oml_mm_id');

		return $hasArr;
	}
}