<?php

/**
 * +----------------------------------------------------------------------
 * | Created By PhpStorm
 * +----------------------------------------------------------------------
 * | DATE: 2021/8/12
 * +----------------------------------------------------------------------
 * | TIME: 13:16
 * +----------------------------------------------------------------------
 * | Author: YangXing(925032253@qq.com)
 * +----------------------------------------------------------------------
 * | Class: param
 * +----------------------------------------------------------------------
 */

namespace model\pro;


class param extends \model
{

    public $pro = null;
    public $key = 'ptpa_id';

    public $table = 'part_param';

    /**
     * 取品名集中所有的参数名称，相同的放在一起
     */
    public function getParamNamesByCates($ids)
    {
        if(is_string($ids)) $ids = explode(',',$ids);
        $rows = $this->db->select('part_param','*',['ptpa_pc_id'=>$ids,'ORDER'=>'en_name']);
        $data = [];
        foreach($rows as $row){
            $key = $row['en_name'];
            if(!isset($data[$key])){
                $data[$key] = [
                    'en_name'=>$row['en_name'],
                    'cn_name'=>$row['cn_name'],
                    'ptpa_unit'=>$row['ptpa_unit'] ?: '',
                    'cates'=>[
                    ]
                ];
            }
            if(!isset($data[$key]['cates'][$row['ptpa_pc_id']])){
                if(empty($data[$key]['ptpa_unit'])) $data[$key]['ptpa_unit'] = $row['ptpa_unit'] ?: '';
                $data[$key]['cates'][$row['ptpa_pc_id']] = [
                    'ptpa_pc_id'=>$row['ptpa_pc_id'],
                    'ptpa_type'=>$row['ptpa_type'],
                    'ptpa_length'=>$row['ptpa_length'],
                    'ptpa_decimal'=>$row['ptpa_decimal']
                ];
            }
        }
        return $data;
    }
    /**
     * 根据分类ID 获取参数
     * @param int $cId
     * @return array|false
     */
    public function getParamByCid(int $cId)
    {
        $where['ptpa_pc_id'] = $cId;
        $field = [
            'ptpa_pc_id','ptpa_is_edit', LG_NAME.'(name)','ptpa_unit','ptpa_syn_field','ptpa_decimal',
            'cn_name','en_name', 'ptpa_type','ptpa_length','ptpa_id','pdfcol'
        ];
        $list = $this->db->select('part_param',$field,$where);
        if(empty($list)){
            $list = [];
        }else{
            $tmp = array_column($list,'ptpa_type');
            $isCanList = 0;
            foreach ($tmp as $v)
            {
                if(in_array($v,['list','radio','checkbox'])){
                    $isCanList = 1;
                    break;
                }
            }

            if($isCanList === 1){
                $ptpaId = array_unique(array_column($list,'ptpa_id'));
                $canList = $this->db->select('part_param_sche','*',['pps_ptpa_id' => $ptpaId,'ORDER' => ['pps_order' => 'ASC']]);
                if(!empty($canList)){
                    $canList = array_column($canList,null,'pps_id');
                }
            }
            if(!empty($canList)){
                $canLists = [];
                foreach ($canList as $va)
                {
                    $canLists[$va['pps_ptpa_id']][] = [
                        'key' => $va['pps_id'],
                        'cn_name' => $va['cn_name'],
                        'en_name' => $va['en_name'],
                        'value' => $va[LG_NAME]
                    ];
                }
            }
            unset($canList,$ptpaId,$isCanList);
            foreach ($list as &$value)
            {
                if(isset($canLists[$value['ptpa_id']]) && !empty($canLists[$value['ptpa_id']])){
                    $value['has_many_scan'] = $canLists[$value['ptpa_id']];
                }
                $value['parameter_value'] = '';
                $value['parameter_text'] = '';
            }
            unset($canLists);
        }
        return $list;
    }

    /**
     * 根据产品ID获取产品参数
     * @param int $pId
     * @param array $param ptpa_in_showlist是否再列表显示
     * ptpa_in_showpage int是否再详情页显示
     * ptpa_is_website int 是否对外网显示
     * ptpa_is_edit int 是否允许编辑
     * ptpa_is_show int 是否全部显示
     *
     * @param int $isScan 是否需要返回全部附表
     * @return array
     */
    public function getProParamByPid(int $pId, $param = [], $isScan = 1): array
    {
        $paramValue = $this->db->select('pro',['[>]pro_param_val' => ['p_id' => 'ppv_p_id']],['ppv_val_smalltxt','ppv_val_string','ppv_val_double','ppv_val_int','ppv_ptpa_id','p_cate','ppv_p_id','ppv_pc_id'],['p_id' => $pId]);
        if (isset($paramValue['0'])) {
            $ptIds = $paramValue['0']['p_cate'];
        } else {
            return [];
        }
        if(empty($paramValue['0']['ppv_ptpa_id'])){
            $paramValue = [];
        }else{
            $paramValue = array_column($paramValue,null,'ppv_ptpa_id');
        }

        $where = [];
        if(!empty($param))
        {
            foreach ($param as $k => $v)
            {
                $where[$k] = (int) $v;
            }
        }
        $where['ptpa_pc_id'] = $ptIds;
        $where['ptpa_is_show'] = 1;
        $where['ORDER'] = ['ptpa_col_order'=>'ASC'];
        $field = [
            'ptpa_pc_id','ptpa_is_edit', 'ptpa_unit','ptpa_syn_field','ptpa_decimal','cn_name','en_name', 'ptpa_type','ptpa_length','ptpa_id','ptpa_enweb_name'
        ];
        $paramName = $this->db->select('part_param',$field,$where);
        $tmp = array_column($paramName,'ptpa_type');
        $isCanList = 0;
        foreach ($tmp as $v)
        {
            if(in_array($v,['list','radio','checkbox'])){
                $isCanList = 1;
                break;
            }
        }

        if($isCanList === 1){
            $ptpaId = array_unique(array_column($paramName,'ptpa_id'));
            $canList = $this->db->select('part_param_sche','*',['pps_ptpa_id' => $ptpaId,'ORDER' => ['pps_order' => 'ASC']]);
            if(!empty($canList)){
                $canList = array_column($canList,null,'pps_id');
            }
        }

        if($isScan == 1 && !empty($canList)){
            $canLists = [];
            foreach ($canList as $va)
            {
                $canLists[$va['pps_ptpa_id']][] = [
                    'key' => $va['pps_id'],
                    'cn_name' => $va['cn_name'],
                    'en_name' => $va['en_name'],
                    'value' => $va[LG_NAME]
                ];
            }
        }
        foreach ($paramName as &$value)
        {
            $value['name'] = $value[LG_NAME];
            if(!empty($value['ptpa_syn_field'])){
                $value['is_edit'] = 0;
            }else{
                $value['is_edit'] = 1;
            }
            $value['parameter_value'] = '';
            $value['parameter_text'] = '';
            if($isScan == 1 && isset($canLists) && isset($canLists[$value['ptpa_id']])){
                $value['has_many_scan'] = $canLists[$value['ptpa_id']];
            }
            if(!empty($paramValue)){
                if(isset($paramValue[$value['ptpa_id']])){
                    switch ($value['ptpa_type']) {
                        case 'int':
                            $value['parameter_value'] = $paramValue[$value['ptpa_id']]['ppv_val_int'];
                            $value['parameter_text'] = $paramValue[$value['ptpa_id']]['ppv_val_int'];
                            break;
                        case 'double':
                            $value['parameter_value'] = floatval(number_format($paramValue[$value['ptpa_id']]['ppv_val_double'], $value['ptpa_decimal'],".",""));
                            $value['parameter_text'] = floatval(number_format($paramValue[$value['ptpa_id']]['ppv_val_double'], $value['ptpa_decimal'],".",""));

                            break;
                        case 'bigtxt':
                        case 'smalltxt':
                            $value['parameter_value'] = $paramValue[$value['ptpa_id']]['ppv_val_smalltxt'];
                            $value['parameter_text'] = $paramValue[$value['ptpa_id']]['ppv_val_string'];
                            break;
                        case 'checkbox':
                            $value['parameter_value'] = explode(',', $paramValue[$value['ptpa_id']]['ppv_val_string']);
                            if(!empty($value['parameter_value'])){
                                unset($value['parameter_text']);
                                foreach ($value['parameter_value'] as $v)
                                {
                                    $value['parameter_text'][] = $canList[$v][LG_NAME];
                                }
                            }
                            break;
                        case 'list':
                        case 'radio':
                            $value['parameter_value'] = $paramValue[$value['ptpa_id']]['ppv_val_int'];
                            $value['parameter_text'] = $canList[$value['parameter_value']][LG_NAME];
                            break;
                        case 'string':
                            $value['parameter_value'] = $paramValue[$value['ptpa_id']]['ppv_val_string'];
                            $value['parameter_text'] = $paramValue[$value['ptpa_id']]['ppv_val_string'];
                            break;
                    }
                }
            }
            if($value['parameter_value']==null) $value['parameter_value'] = '';
        }
        if($paramName){
            if(is_null($this->pro)){
                $this->pro = makeOne(\model\pro\pro::class);
            }
            foreach($paramName as $k=>$v){
                $paramName[$k]['parameter_value'] = $this->pro->getParamLangText($v['ptpa_id'],$v['parameter_value']); 
                $paramName[$k]['parameter_text'] = $this->pro->getParamLangText($v['ptpa_id'],$v['parameter_text']); 
            }
        }
        return $paramName ?: [];
    }

    public function setParam($data,$pId)
    {   
        //获取该产品的所有参数
        $arr = $this->getProParamByPid($pId);    
        $tmpdata = array_column($data,null,'ppv_ptpa_id');
        $changeArr = [];
        foreach ($arr as $val) 
        {
            if(isset($tmpdata[$val['ptpa_id']]) && isset($tmpdata[$val['ptpa_id']]['ppv_val_'.$val['ptpa_type']]) 
            && isset($val['parameter_value']) && $tmpdata[$val['ptpa_id']]['ppv_val_'.$val['ptpa_type']] != $val['parameter_value']
            ){
                $changeArr[] = ['field'=>'ppv_ptpa_id','name'=>$val[LG_NAME],'old'=>$val['parameter_value'],'new'=>$tmpdata[$val['ptpa_id']]['ppv_val_'.$val['ptpa_type']]];
            }
        }

        $this->db->begin();
        //日志
        if($changeArr){
            $logdata = [
				'cl_type'=>'pro',
				'cl_act'=>'edit',
				'cl_dataid'=>$pId,
				'cl_change'=>json_encode(['param'=>$changeArr], JSON_UNESCAPED_UNICODE),
				'cl_opuser'=>getOpuser(),
				'cl_create_time'=>getNowTime(),
			];
			$this->db->insert('change_log',$logdata);
        }

        $list = $this->db->select('pro_param_val','ppv_ptpa_id',['ppv_p_id' => $pId]);
		foreach ($data as $value)
		{
			//存在的
			if(in_array($value['ppv_ptpa_id'],$list)){
				$ptpaId = $value['ppv_ptpa_id'];
				unset($value['ppv_ptpa_id'],$value['ppv_p_id']);
				$this->db->update('pro_param_val',$value,['ppv_p_id' => $pId,'ppv_ptpa_id' => $ptpaId]);
			}else{
				$this->db->insert('pro_param_val',$value);
			}
		}
        return $this->db->end();
    }

	
	public function setProParamByApi($param)
	{
		$num = formatNum($param['gspNum']);
		$pro = new \model\pro\pro();
		$pidArr = $pro->chkProIdByAny(['innum'=>$param['gspNum']]);
		if(empty($pidArr)) return ['msg'=>$param['gspNum'].'不存在'];
		foreach($pidArr as $pId)
		{
			$data = $this->getProParamByPid($pId);
			$setArr = [];
			foreach($data as $field)
			{
				if($field['ptpa_syn_field']!='' && $field['ptpa_syn_field'] == $param['cate'])
				{
					$value = $param['param'];
					$setArr[] = [
						'ppv_p_id' => $pId,
						'ppv_pc_id' => $field['ptpa_pc_id'],
						'ppv_ptpa_id' => $field['ptpa_id'],
						'ppv_val_int' => $field['ptpa_type'] == 'int' ? $value : NULL,
						'ppv_val_double' => $field['ptpa_type'] == 'double' ? $value : NULL,
						'ppv_val_string' => in_array($field['ptpa_type'],['string','list','redio','checkbox']) ? $value : NULL,
						'ppv_val_smalltxt' => in_array($field['ptpa_type'],['smalltxt','bigtxt']) ? $value : NULL,
					];
				}
			}
			if(!empty($setArr))
			{
				$this->setParam($setArr,$pId);
			}
			else
			{
				return['msg'=>'参数错误'];
			}
		}
		return [];
	}


	public function eqname($value, $cat_id)
	{
		$join = ["[>]pro_cate(cat)" => ["pa.ptpa_pc_id" => "id"]];
		$where = [
			'OR #1'=>[
				'pa.cn_name'=>$pcate,
				'pa.en_name'=>$pcate
			],
			'cat.id'=>$cat_id
		];
		return $this->db->get('part_param(pa)', $join, "ptpa_id",$where);
    }
}