<?php
/**
 * 营养品管理
 * author:wangshuo
 * date:2021/5/18
 *
 */
namespace app\p\logic;
use app\model\NutritionStation as modelNutritionStation;
use app\model\NutritionStationExt as modelNutritionStationExt;
use app\model\Nutrition as modelNutrition;
use app\model\NutritionCupboard as NutritionCupboardModel;
use app\model\NutritionTime as NutritionTimeModel;
use app\model\Annex as modelAnnex;
use think\Db;
use think\Exception;
class NutritionStation{

    protected $model;
    protected $modelAnnex;
    protected $articleCateModel;
    protected $nutritionCuboardModel;
    protected $nutritionTimeModel;
    private  static $station_num  = 22;
    public function __construct() {
        $this->model = new modelNutritionStation();
        $this->modelExt = new modelNutritionStationExt();
        $this->modelNutrition = new modelNutrition();
        $this->modelAnnex = new modelAnnex();
        $this->nutritionCuboardModel = new NutritionCupboardModel();
        $this->nutritionTimeModel = new NutritionTimeModel();
    }

    /**
     *  获取营养品列表
     * @return array
     */
    public function lists($where, $page, $pageSize, $orderBy, $field) {
        $data['total'] = $this->model->inquiryCount($where);
        $station = $this->model->inquiry($where, $page, $pageSize, $orderBy, $field);
        if (!empty($station)) {
            foreach ($station as $key => $value) {
                $station[$key] = $this->normalizeStationDate($value);
                $station[$key]['img_path'] = getImgFullPath($value['img_path']);
            }
        }
        $data['rows'] = $station;
        return ['code' => 0, 'message' => '获取成功', 'data' =>$data];
    }

    public function nutritionList($where, $page, $pageSize, $orderBy, $field, $station_uuid, $num) {
        $data['total'] = $this->modelNutrition->inquiryCount($where);
        $nutrition = $this->modelNutrition->inquiry($where, $page, $pageSize, $orderBy, $field);
        //获取营养品服用时间数组,并转换为汉字
        $use_time_arr = $this->nutritionTimeModel->inquiryAll(['del_flag'=>0],'',['uuid','name']);
        $use_time_name = array_column($use_time_arr, "name", "uuid");
        foreach ($nutrition as &$value){
            $use_time_cn = '';
            foreach (explode(',',$value['use_time']) as $use_time_uuid){
                if(isset($use_time_name[$use_time_uuid])){
                    if($use_time_cn){
                        $use_time_cn = $use_time_cn . ',' . $use_time_name[$use_time_uuid];
                    }else{
                        $use_time_cn = $use_time_name[$use_time_uuid];
                    }
                }
            }
            $value['use_time_cn'] = $use_time_cn;
            $value['img_path'] = getImgFullPath($value['img_path']);
        }
        if($station_uuid && $num){
            //处理选中状态
            $where_station['station_uuid'] = $station_uuid;
            $where_station['nutrition_uuid'] = ['neq','not null'];
            $choice_nutrition = $this->modelExt->inquiryColumn($where_station, 'nutrition_uuid');
            //处理选中营养品
            $where_station['num'] = $num;
            $choice_num = $this->modelExt->inquiryColumn($where_station, 'nutrition_uuid');
            if($nutrition) {
                foreach ($nutrition as &$value) {
                    $value['selected'] = 0;
                    if ($choice_num && $value['uuid'] == $choice_num[0]) {
                        $value['selected'] = 1;
                    }
                }
            }
        }
        $data['rows'] = $nutrition;
        return ['code' => 0, 'message' => '获取成功', 'data' =>$data];
    }

    /**
     * 读取营养品
     * @param type $uuid
     * @return type
     */
    public function info($uuid) {
        $nutrition = $this->model->read($uuid);
        if(!$nutrition){
            return ['code' => 1, 'message' => '获取失败', 'data' =>''];
        }
        $nutrition = $this->normalizeStationDate($nutrition);
        $nutrition['img_path'] = getImgFullPath($nutrition['img_path']);
        $nutrition_ext = $this->modelExt->inquiryInfo($uuid);
        foreach($nutrition_ext as $key=>$nutrition_ext_list)
        {
            $nutrition_ext_list['img_path'] = getImgFullPath($nutrition_ext_list['img_path']);
            if($nutrition_ext_list['num']>=11&&$nutrition['version']==2)
               $nutrition_ext_list['num'] =  $nutrition_ext_list['num']-2;
            $nutrition_ext[$key] = $nutrition_ext_list;
        }
        $nutrition['nutrition_ext'] = $nutrition_ext;
        
        $file_path = $this->modelAnnex->inquiryColumn(['master_uuid'=>$uuid],'file_path');
        $nutrition['file_path'] = $file_path;
//        if(empty($nutrition_ext)){
//            $num = self::$station_num;
//            for($i = 0; $i < $num; $i++){
//                $arr = ['station_uuid'=>$uuid,'nutrition_uuid'=>null,'num'=>$i+1];
//                $nutrition_ext[] = $arr;
//            }
//        }
        $OSSServer = \oss\OSSServer::getInstance();
        $ossConfig = $OSSServer->getConfig();
        $nutrition['fileUrlPrefix'] = $ossConfig['fileUrlPrefix'];
        return ['code' => 0, 'message' => '获取成功', 'data' =>$nutrition];
    }

    /**
     *  编辑营养站
     * @return array
     */
    public function update($params) {
       try{
           $uuid = $params['uuid'];
           unset($params['uuid']);
           $nutrition = $this->model->read($uuid);
           if (!$nutrition) {
               throw  new Exception('参数未查询出数据');
           }
           $img_path_arr = empty($params['file_path']) ? [] : json_decode($params['file_path'], 1);
           unset($params['file_path']);
           
           $http_host = $_SERVER['HTTP_HOST'];
           $interval_time = empty($params['interval_time']) ? 0 : $params['interval_time'];
           $sys_data = ['device_code'=>$nutrition['code'],'time_interval'=>$interval_time, 'imgs'=>[]];
           
           $add_arr = array();
           foreach ($img_path_arr as $file_path){
               $arr = array();
               $arr['uuid'] = guid();
               $arr['master_uuid'] = $uuid;
               $arr['file_path'] = $file_path;
               $arr['create_time'] = date('Y-m-d H:i:s');
               $add_arr[] = $arr;
               $sys_data['imgs'][] = getImgFullPath($file_path);
           }
           
           DB::startTrans();
           $del_res = $this->modelAnnex->delByWhere(['master_uuid'=>$uuid]);
           if($del_res === false){
               throw new Exception('关联轮播图删除失败');
           }
           if($add_arr) {
                $insert_res = $this->modelAnnex->insertAll($add_arr);
                if($insert_res === false){
                    throw new Exception('关联轮播图保存失败');
                }
           }
//           $num = self::$station_num;
//           $nutrition_ext = $params['nutrition_ext'];
//           if(!is_array($nutrition_ext)){
//               $nutrition_ext = json_decode($nutrition_ext,true);
//           }
//           if(count($nutrition_ext) != $num){
//               throw new Exception('货品存放信息有误');
//           }
//           unset($params['nutrition_ext']);
           $params['date'] = date('Y-m-d H:i:s');
           $res = $this->model->modify($uuid, $params);
           if ($res === false) {
               throw new Exception('修改失败');
           }
           
           DB::commit();
           
            //同步轮播图
//            curl_send(config("yyz_url"), $sys_data);
           
       } catch (Exception $e) {
           DB::rollback();
           return ['code' => 1, 'message' => $e->getMessage(), 'data' =>[]];
       }
       return ['code' => 0, 'message' => '修改成功', 'data' =>[]];
    }

    /**
     *  编辑
     * @return array
     */
    public function updateExt($params) {
        try{
            DB::startTrans();
            $this->lockStationForDm((string)$params['station_uuid']);
            
            $data['station_uuid'] = $params['station_uuid'];
            $data['num'] = $params['num'];
            $nutrition_ext = $this->modelExt->where($data)->find();
            $data['nutrition_uuid'] = $params['nutrition_uuid'];
            if (!empty($nutrition_ext)) {
                $nutrition_ext = $nutrition_ext->toArray();
                //需要更新
                $ext_id = $nutrition_ext['id'];
                $res = $this->modelExt->modifyById($ext_id,$data);
            }else{
                //需要新增
                $res = $this->modelExt->insertGetId($data);
                $ext_id = $res;
            }
            if ($res === false) {
                throw new Exception('保存货品存放信息失败');
            }
            
            //记录营养品所在格子情况
            if(!empty($nutrition_ext['nutrition_uuid'])) {    //之前绑定的营养品
                $old_nutrition_uuid = $nutrition_ext['nutrition_uuid'];
                $current_num = 0;
                $nutrition_cupboard = $this->nutritionCuboardModel
                        ->where(['station_uuid' => $params['station_uuid'],'nutrition_uuid' => $old_nutrition_uuid])
                        ->find();
                if($nutrition_cupboard) {
                    $nutrition_cupboard = $nutrition_cupboard->toArray();
                    $current_num = $nutrition_cupboard['current_num'];
                }
                $all_num = $this->modelExt->inquiryColumn(['station_uuid' => $params['station_uuid'],'nutrition_uuid' => $old_nutrition_uuid],'num');
                $all_num_str = '';
                if($all_num) {
                    $all_num_str = implode(",", $all_num);
                }
                $nutrition_cupboard_arr = [
                    'station_uuid' => $params['station_uuid'],
                    'nutrition_uuid' => $old_nutrition_uuid,
                    'current_num' => $current_num,
                    'all_num' => $all_num_str
                ];
                $res = $this->replaceCupboard($nutrition_cupboard_arr);
                if($res === false) {
                    throw new Exception("保存货品存放信息失败");
                }
            } 
            if(!empty ($params['nutrition_uuid'])) {    //新绑定的营养品
                $current_num = 0;
                $nutrition_cupboard = $this->nutritionCuboardModel
                        ->where(['station_uuid' => $params['station_uuid'],'nutrition_uuid' => $params['nutrition_uuid']])
                        ->find();
                if($nutrition_cupboard) {
                    $nutrition_cupboard = $nutrition_cupboard->toArray();
                    $current_num = $nutrition_cupboard['current_num'];
                }
                $all_num = $this->modelExt->inquiryColumn(['station_uuid' => $params['station_uuid'],'nutrition_uuid' => $params['nutrition_uuid']],'num');
                $all_num_str = '';
                if($all_num) {
                    $all_num_str = implode(",", $all_num);
                }
                $nutrition_cupboard_arr = [
                    'station_uuid' => $params['station_uuid'],
                    'nutrition_uuid' => $params['nutrition_uuid'],
                    'current_num' => $current_num,
                    'all_num' => $all_num_str
                ];
                $res = $this->replaceCupboard($nutrition_cupboard_arr);
                if($res === false) {
                    throw new Exception("保存货品存放信息失败");
                }
            }
            
            DB::commit();
        } catch (Exception $e) {
            DB::rollback();
            return ['code' => 1, 'message' => $e->getMessage(), 'data' =>[]];
        }
        //根据$params['nutrition_uuid']获取营养品数据
        $nutrition = $this->modelNutrition->read($params['nutrition_uuid']);
        if (is_array($nutrition)) {
            $nutrition = \app\common\service\NutritionPlainFloatWeight::physicalForModel($nutrition, $this->modelNutrition);
        }
        return ['code' => 0, 'message' => '修改成功', 'data' =>$nutrition];
    }

    private function replaceCupboard(array $row)
    {
        $isDameng = ltrim((string)config('database.type'), '\\') === \app\cores\database\Dm::class;
        if ($isDameng) {
            // MySQL REPLACE removes the old unique-key row before inserting a new ID.
            $deleted = $this->nutritionCuboardModel->where([
                'station_uuid' => $row['station_uuid'],
                'nutrition_uuid' => $row['nutrition_uuid'],
            ])->delete();
            if ($deleted === false) {
                throw new Exception('保存货品存放信息失败');
            }
        }
        return $this->nutritionCuboardModel->add($row, !$isDameng);
    }

    private function lockStationForDm(string $stationUuid): void
    {
        if (ltrim((string)config('database.type'), '\\') === \app\cores\database\Dm::class) {
            $this->model->where('uuid', $stationUuid)->lock(true)->find();
        }
    }
    private function normalizeStationDate(array $row): array
    {
        if (ltrim((string)config('database.type'), '\\') !== \app\cores\database\Dm::class) {
            return $row;
        }
        $value = $row['date'] ?? null;
        if (is_string($value)
            && preg_match('/^((\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2}))\.0{1,6}$/D', $value, $match)
            && (int)$match[2] >= 1000 && checkdate((int)$match[3], (int)$match[4], (int)$match[2])
            && (int)$match[5] <= 23 && (int)$match[6] <= 59 && (int)$match[7] <= 59) {
            $row['date'] = $match[1];
        }
        return $row;
    }


}
