<?php
/**
 *
 */
include_once(SERVER_ROOT."/model/mBase.php");


class mCase extends mBase {
    private $obj;
    private $tbl;
    private $case_herb_tbl;
    private $herb_tbl;
    private $collect_log_tbl;

    public function __construct() {
        $this->obj = new dCase();
        $this->tbl = 'tcm_case';
        $this->case_herb_tbl = 'tcm_case_herb';
        $this->herb_tbl = 'tcm_herb';
        $this->collect_log_tbl = 'tcm_collect_log';
    }

    public function createCase($name, $source, $original, $method, $herbs){
        if(empty($name)){$this->setError('药方名称不能为空');return false;}
        if(empty($source)){$this->setError('药方来源不能为空');return false;}
        if(empty($original)){$this->setError('药方原方不能为空');return false;}
        if(empty($method)){$this->setError('药方用法不能为空');return false;}
        if(empty($herbs)){$this->setError('药方药材不能为空');return false;}

        $id = $this->obj->insert($this->tbl, array('name'=>$name, 'source'=>$source, 'original'=>$original, 'method'=>$method));
        if(!$id){$this->setError('添加失败');return false;}

        //格式化药方对应的药材数据
        $case_herb = $this->formatCaseHerb($id, $herbs);
        //创建药方对应的药材
        $this->createCaseHerb($case_herb);

        return $id;
    }

    public function updateCase($id, $name, $source, $original, $method, $herbs){
        if(empty($herbs)){$this->setError('药方药材不能为空');return false;}

        $data = array();
        if(!empty($name)){$data['name']=$name;}
        if(!empty($source)){$data['source']=$source;}
        if(!empty($original)){$data['original']=$original;}
        if(!empty($method)){$data['method']=$method;}

        $res = $this->obj->update($this->tbl, $data, array('sql'=>'`id`=?', 'vals'=>array($id)));
        if(!$res){$this->setError('更新失败');return false;}

        //格式化药方对应的药材数据
        $case_herb = $this->formatCaseHerb($id, $herbs);
        //更新药方对应的药材
        $this->compareCaseHerb($id, $case_herb);

        return true;
    }

    public function formatCaseHerb($case_id,$herbs){
        $case_herb = array();
        foreach ($herbs as $key=>$item) {
            $temp = array();
            $temp['case_id']=$case_id;
            $temp['num']=$item['num'];
            $temp['sort']=$key;

            $herb = $this->getHerbByName($item['name']);
            if($herb){
                $temp['herb_id'] = $herb['id'];
            }else{
                $temp['herb_id'] = $this->createHerb(array('name'=>$item['name']));
            }
            $case_herb[] = $temp;
        }
        return $case_herb;
    }

    public function getHerbByName($name){
        return $this->obj->select($this->herb_tbl, array('sql'=>'`name`=?', 'vals'=>array($name)));
    }

    public function createHerb($info){
        $herb_id = $this->obj->insert($this->herb_tbl, $info);
        if(empty($herb_id)){$this->setError('添加药材失败');return false;}

        return $herb_id;
    }

    public function createCaseHerb($info){
        $res = $this->obj->mutiInsert($this->case_herb_tbl, $info);
        if(!$res){$this->setError('添加药方药材失败');return false;}

        return true;
    }

    public function compareCaseHerb($id,$new_data){
        $old_data = $this->getCaseHerbByCaseId($id);

        $old_num = count($old_data);
        $new_num = count($new_data);

        if($old_num>=$new_num){
            //需要删除药方对应的药材
            foreach ($old_data as $key => $value) {
                if(!isset($new_data[$key])){
                    $res = $this->obj->delete($this->case_herb_tbl, array('sql'=>'`id`=?', 'vals'=>array($value['id'])));
                    if(!$res){$this->setError('删除药方药材失败');return false;}
                }
                $res = $this->obj->update($this->case_herb_tbl, $new_data[$key], array('sql'=>'`id`=?', 'vals'=>array($value['id'])));
                if(!$res){$this->setError('更新药方药材失败');return false;}
            }
        }else{
            //需要增加药方对应的药材
            foreach ($new_data as $key => $value) {
                if(!isset($old_data[$key])){
                    $res = $this->obj->insert($this->case_herb_tbl, $value);
                    if(!$res){$this->setError('添加药方药材失败');return false;}
                }
                $res = $this->obj->update($this->case_herb_tbl, $value, array('sql'=>'`id`=?', 'vals'=>array($old_data[$key]['id'])));
                if(!$res){$this->setError('更新药方药材失败');return false;}
            }
        }

        return true;
    }

    public function getCaseHerbByCaseId($case_id){
        return $this->obj->selectAll($this->case_herb_tbl, array('sql'=>'`case_id`=?','vals'=>array($case_id)), 'sort asc ');
    }

    public function getCaseByName($name, $page_num, $page_size) {
        $sql = " `name` like '%{$name}%'";

        $offset = ($page_num - 1) * $page_size;
        $res = $this->obj->selectAll($this->tbl, array('sql'=>$sql, 'vals'=>array()), 'use_num desc,sort asc ', array($offset, $page_size));

        if(empty($res)) return array();
        return $res;
    }

    public function getCaseByNameTotal($name) {
        $sql = " `name` like '%{$name}%'";

        return $this->obj->count($this->tbl, array('sql'=>$sql, 'vals'=>array()));
    }

    public function getCaseInfo($id) {
        //药方信息
        $case = $this->getCaseById($id);
        if(empty($case)){$this->setError('查询不到此药方');return false;}

        //药方药材信息
        $case_herb = $this->getCaseHerbByCaseId($case['id']);
        if(empty($case_herb)){$this->setError('药方药材查询失败');return false;}

        //药材名称
        $herb_ids = array_column($case_herb,'herb_id');
        $herb = $this->getHerbByIds($herb_ids);
        if(empty($herb)){$this->setError('药材名称查询失败');return false;}

        return array(
            'case' => $case,
            'case_herb' => $case_herb,
            'herb' => array_column($herb,null,'id'),
        );
    }

    public function getCaseById($id){
        return $this->obj->select($this->tbl, array('sql'=>'`id`=?','vals'=>array($id)));
    }

    public function getHerbByIds($ids){
        return $this->obj->selectIn($this->herb_tbl, array('id'=>$ids));
    }

    public function getCaseByIds($ids){
        return $this->obj->selectIn($this->tbl, array('id'=>$ids));
    }

    public function updateCaseSearchNum($id){
        $res = $this->obj->increase($this->tbl, array('sql'=>'`id`=?', 'vals'=>array($id)),'use_num');
        if(!$res){
            $tool_obj = new qTool();
            $tool_obj->trackLog('tcm', $id, sprintf(LOG_TRACK_SAVE_PATH, date('Y-m-d'), 'tcm_case_use_num'));

            $this->setError('药方使用次数更新失败');
            return false;
        }

        return true;
    }

    public function getCollectLog($page_num, $page_size) {
        $offset = ($page_num - 1) * $page_size;
        return $this->obj->selectAll($this->collect_log_tbl, array(), 'collect_time desc ', array($offset, $page_size));
    }

    public function getCollectLogTotal() {
        return $this->obj->count($this->collect_log_tbl, array());
    }

}