<?php

namespace admin\action;
use \model\element;

/**
 * Class elementAction
 * @package admin\action
 */
class elementAction  extends \action
{
    public $elename = '';
    public $elecfg = null;
    public $element = null;
	public function __construct($elename='')
    {
		$this->elename = ($elename!='') ? $elename : \mvc::$req['elename'];
		$this->elecfg = require(\mvc::$cfg['projectDir'].'/element/'.$this->elename.'.php');
        //权限控制
        if(!\p::isAdmin() && isset($this->elecfg['pwcode']) && $this->elecfg['pwcode']!==''){
            $pwcode = $this->elecfg['pwcode'];
            if(!\p::has($pwcode,'view')){
                $this->elecfg['url']['list'] = false;
                $this->elecfg['url']['detail'] = false;
            }
            if(!\p::has($pwcode,'add')){
                $this->elecfg['url']['addview'] = false;
            }
            if(!\p::has($pwcode,'edit')){
                $this->elecfg['url']['edit'] = false;
                $this->elecfg['url']['editCell'] = false;
            }
            if(!\p::has($pwcode,'delete')){
                $this->elecfg['url']['delete'] = false;
                $this->elecfg['url']['deleteRows'] = false;
            }
            if(!\p::has($pwcode,['add','import'])){
                $this->elecfg['url']['import'] = false;
            }
            if(!\p::has($pwcode,['export'])){
                $this->elecfg['url']['export'] = false;
            }
            if(\p::has($pwcode,['check1'])){
                $this->elecfg['url']['check1']['enable'] = true;
            }else{
                $this->elecfg['url']['check1']['enable'] = false;
            }
        }
		$this->element = new element($this->elecfg);
	}

	//js取ele配置文件
	public function getEleConfig()
    {
		$this->successJson($this->elecfg);
	}

	//列表页
	public function listView($id = 0)
    {
        $req = \mvc::$req;
		//前置条件
		$rules = $this->urlRulesToWhere($req);
        if(isset($req['title'])){
            \view::set('title',$req['title']);  
        }
		\view::set('ele',$this->elecfg);
		\view::set('rulesArr',$rules);
		\view::put('element/list');
	}

    /**
     * @param
     */
	public function list($id = 0)
    {
        $req = \mvc::$req;
		//前置条件
		$rules = $this->urlRulesToWhere($req);
		if(isset($req['numbers'])){
			$rules['numbers'] = arryNums($req['numbers']);
			$rules['numberFormats'] = formatNums($req['numbers']);
			$rules['numlike'] = empty($req['numlike']) ? 0 : $req['numlike'];
		}
		if(isset($req['keys'])){
			$rules['keys'] = explode(',',$req['keys']);
		}
        if(isset($req['supplier']) && !empty($req['supplier'])){
			$rules['supplier'] = explode(',',$req['supplier']);
		}
        $orderby = '';
        if($req['sidx']=='' && $this->elecfg['order']!='') $orderby = $this->elecfg['order'];
        $data = $this->element->list($rules,$req['filters'], $req['page'], $req['rows'], $req['sidx'], $req['sord'],$orderby);
        $this->successJson($data);
	}

    /**
     * @param
     */
	public function checkUnique($field,$value,$key)
    {
        $result = ['exists'=>0];
        if($this->element->hasWithOut($field,$value,$key)){
            $result = ['exists'=>1];
        }
        $this->successJson($result);
	}

    public function editCell()
    {
		$req = \mvc::$req;
        $id = $req['id'];
        $oper = $req['oper'];
        $field = $req['field'];
		if(isset($req['value']))
			$value = $req['value'];
 		else
			$value = $req[$field];
        if($oper=='edit' && !empty($field)){
			if(isset($this->elecfg['uniqueFields']) && !empty($this->elecfg['uniqueFields']) && in_array($field,  $this->elecfg['uniqueFields'])){
				if($this->element->hasUnique($id,$field,$value)){
                    exit(lg("重复的记录,保存失败"));
				}
			}
            if($value!='' && $this->elecfg['fields'][$field]['unique'] && !$this->elecfg['fields'][$field]['key']){
                if($this->element->hasWithOut($field,$value,$id)){
                   exit(sprintf("重复的 [ %s ] 在 [ %s ] 中",$value,$this->elecfg['fields'][$field][LG_NAME]));
                }
            }
            $this->element->setValue($id,$field,$value);
            if(isset($this->elecfg['fields']['opuser'])){
                $this->element->setValue($id,'opuser',getOpuser());
            }
            if(isset($this->elecfg['fields']['update_time'])){
                $this->element->setValue($id,'update_time',getNowTime());
            }
        }else{
			$this->errorJson(500);
		}
    }

    public function detail($key)
    {
        $req = \mvc::$req;
		//前置条件
		$rules = $this->urlRulesToWhere($req);
        $headerTitle = '添加';
        if($key == '0'){
            $item[$this->elecfg['key']] = 0;
            foreach($this->elecfg['fields'] as $k=> $field){
                if(isset($field['editor']['default'])){
                    $item[$k] = $field['editor']['default'];
                }
            }
        }else{
            $item = $this->element->getRowInfo($key);
            $headerTitle = '编辑';
        }
        if(!empty($this->elecfg['urlFields'])){
            foreach($this->elecfg['urlFields'] as $field){
                if(isset($req[$field])){
                    $item[$field] = $req[$field];
                }elseif(isset($rules[$field])){
                    $item[$field] = $rules[$field];
                }
            }
        }
        \view::set('headerTitle',$headerTitle);
        \view::set('item',$item);
		\view::set('ele',$this->elecfg);
		\view::set('rulesArr',$rules);
		\view::put('element/detail');
    }

    public function edit()
    {
		$req = \mvc::$req;
        $key = $req['key'];
        unset($req['key']);
        unset($req['elename']);
        if(isset($this->elecfg['uniqueFields']) && !empty($this->elecfg['uniqueFields'])){
            $find = [];
            $msg = '';
            foreach($this->elecfg['uniqueFields'] as $field){
                $find[$field] = $req[$field];
                if($msg!='') $msg.=', ';
                $msg .= $this->elecfg['fields'][$field][LG_NAME];
            }
            $find[$this->elecfg['key'].'[!]'] = $key;
            $rows = $this->element->getRowByWhere($find);
            if(!empty($rows)){
                $this->msgJson(sprintf("重复的 [ %s ]",$msg));
                exit();
            }
        }
        foreach($this->elecfg['fields'] as $k=>$v){
            if(isset($v['auto'])){
                switch ($v['auto']) {
                    case 'opuser':
                        $req[$k] = getOpuser();
                        break;
                    case 'create_time':
                        if(empty($key)){
                            $req[$k] = getNowTime();
                        }
                        break;
                    case 'update_time':
                        $req[$k] = getNowTime();
                        break;
                }
            }
        }
        foreach($req as $k=>$v){
            if($this->elecfg['fields'][$k]['unique'] || $this->elecfg['fields'][$k]['key']){
                if($this->element->hasWithOut($k,$v,$key)){
                    $this->msgJson(sprintf("重复的 [ %s ] 在 [ %s ] 中",$v,$this->elecfg['fields'][$k][LG_NAME]));
                    exit();
                }
            }
			if(isset($this->elecfg['fields'][$k]['editor']['ruleFunction']) && !empty($this->elecfg['fields'][$k]['editor']['ruleFunction'])){
				$this->elecfg['fields'][$k]['editor']['ruleFunction']($req[$this->elecfg['fields'][$k]['field']],$req,$this->element->getDb());
			}
            if(isset($this->elecfg['fields'][$k]['editor']['formatfield'])){
                $req[$this->elecfg['fields'][$k]['editor']['formatfield']] = formatNum($v);
            }
        }
        
        if(isset($this->elecfg['fields']['opuser'])) $req['opuser'] = getOpuser();
        if(isset($this->elecfg['fields']['update_time'])) $req['update_time'] = getNowTime();
        if(empty($key)){
            if($req[$this->elecfg['key']]=='') unset($req[$this->elecfg['key']]);
            if(isset($this->elecfg['fields']['create_time'])) $req['create_time'] = getNowTime();
            $id = $this->element->add($req);
            $this->successJson(['key'=>$id,'op'=>'add']);
        }else{
            if($this->element->edit($key,$req)){
                $this->successJson(['key'=>$key,'op'=>'edit']);
            }
        }
    }

    public function deleteRows()
    {
        $req = \mvc::$req;
        if($this->element->deleteRows($req['ids'])){
            $this->successJson(lg('删除完成'));
        }
    }
    
    //对比
    public function compare()
    {
        $req = \mvc::$req;
		//前置条件
		$rules = $this->urlRulesToWhere($req);
        \view::set('item',$item);
		\view::set('ele',$this->elecfg);
		\view::set('rulesArr',$rules);
		\view::put();
    }
    
    //check1
    public function check1($ids,$state)
    {
        $req = \mvc::$req;
		//前置条件
		$rules = $this->urlRulesToWhere($req);
		if(is_string($ids)) $ids = explode(',',$ids);
        $this->element->check1($ids,$state);
        $this->successJson();
    }

    public function getCompareCfgAndRows($ids)
    {
        $data = $this->element->getRowsByFieldValue($this->elecfg['key'],$ids,$fields);
        if(isset($this->elecfg['compare']['function'])){
            foreach($data as $i=>$row){
                $this->elecfg['compare']['function']($row,$this->elecfg,$this->element->getDb());
                $data[$i] = $row;
            }
        }
        $this->successJson(['cfg'=>$this->elecfg,'data'=>$data]);
    }

    public function getCompareRows($ids)
    {
        $data = $this->element->getRowsByFieldValue($this->elecfg['key'],$ids,$fields);
        if(isset($this->elecfg['compare']['function'])){
            foreach($data as $i=>$row){
                $this->elecfg['compare']['function']($row,$this->elecfg,$this->element->getDb());
                $data[$i] = $row;
            }
        }
        $this->successJson($data);
    }

    public function getAll($where=null,$fields=null)
    {
		$where = $this->urlRulesToWhere($req);
		if(!empty($this->elecfg['where'])){
		    $where = array_merge($this->elecfg['where'],$where);
		}
        $data = $this->element->getAll($where,$fields);
        $this->successJson($data);
    }

    public function getAllKeyValues($fields=null)
    {
		$req = \mvc::$req;
		if(isset($req['query']) && isset($req['limit'])){
			$rows = $this->element->search($req['query'],$req['limit']);
		}else{
			$where = $this->urlRulesToWhere($req);
			if($this->elename != 'user' && !empty($this->elecfg['where'])){
			    $where = array_merge($this->elecfg['where'],$where);
			}
			$rows = $this->element->getAll($where,$fields);
		}
        $data = [];
        $regi=0;
		$firstkey = isset($req['firstkey'])? $req['firstkey']: 0;
        if(isset($req['hasFirst']) && $req['hasFirst']){
            $data[0] = ['key'=>$firstkey, 'value'=>'' ];
            $regi = 1;
        }
        foreach($rows as $k=>$row){
            $caption = $row[$this->elecfg['caption']];
            if(!empty($req['captions'])){
                $arr = explode(',',$req['captions']);
                $caption = '';
                foreach($arr as $f){
                    if($caption!='') $caption.=', ';
                    $caption .= $row[$f];
                }
            }
            $data[] = ['key'=>$row[$this->elecfg['key']], 'value'=> $caption ];
        }
		$emptykey = isset($req['emptyKey'])? $req['emptyKey']: -1;
        if(isset($req['hasEmpty']) && $req['hasEmpty']){
            $data[] = ['key'=>$emptykey, 'value'=>lg('不存在')];
        }
        $this->successJson($data);
    }

    public function getRowByFieldValue($field,$value,$fields=null)
    {
        $data = $this->element->getRowByFieldValue($field,$value,$fields);
        $this->successJson($data);
    }

    public function getRowsByFieldValue($field,$value,$fields=null)
    {
        $data = $this->element->getRowsByFieldValue($field,$value,$fields);
        $this->successJson($data);
    }

    public function getRowByWhere($where,$fields=null)
    {
        $data = $this->element->getRowByWhere($where,$fields);
        $this->successJson($data);
    }

    public function getRowsByWhere($where,$fields=null,$group=null)
    {
        $data = $this->element->getRowsByWhere($where,$fields,$group);
        $this->successJson($data);
    }

    public function getRowByKey($value,$fields=null)
    {
        $data = $this->element->getRowByFieldValue($this->elecfg['key'],$value,$fields);
        $this->successJson($data);
    }

    public function getRowsByKey($value,$fields=null)
    {
        $data = $this->element->getRowsByFieldValue($this->elecfg['key'],$value,$fields);
        $this->successJson($data);
    }
}