<?php
// 营养素缺乏调查
declare (strict_types=1);

namespace app\store\model\nutrition;

use app\common\model\nurtition\NutritionLack as NutritionLackModel;
use app\common\model\nurtition\NutritionMeals as NutritionMealsModel;

class NutritionLack extends NutritionLackModel
{
    /**
     * 营养素缺乏调查设置
     * @param array $enum_data
     * @param array $lack_data
     * @param array $meal_data
     * @param array $nutrition_data
     * @param string $set_date
     * @param int $staff_id
     * @param int $user_id
     * @param string $create_by
     * @return bool
     * @date 2024/8/26/18:05
     * @author RenPengJu
     */
    public function setProblem(array $enum_data,array $lack_data,array $meal_data,
                               array $nutrition_data,string $set_date,int $staff_id,
                               int $user_id, string $create_by,string $other_text): bool
    {
        $master_data = [
            'staff_id' => $staff_id,
            'set_date' => $set_date,
            'user_id' => $user_id,
            'type' => 6,
            'other_text' => $other_text,
            'store_id' => self::$storeId,
        ];
        $this->transaction(function () use ($enum_data,$lack_data,$meal_data,$master_data,$nutrition_data,$create_by){
            if (!empty($enum_data)){
                $new_where = [
                    'staff_id' => $master_data['staff_id'],
                    'set_date' => $master_data['set_date'],
                    'user_id' => $master_data['user_id'],
                    'type' => 6,
                    'is_delete' => 0,
                ];

                $master_id = $this->addMaseter($new_where,$master_data,$create_by);
                $delete_res = $this->where($new_where)->update(['is_delete' => 1]);
                if ($delete_res === false) {
                    return false;
                }
                $new_enum_data = [];
                foreach ($enum_data as $enum){
                    if ($enum['checked'] != 3){
                        $new_enum_data[] = [
                            'staff_id' => $master_data['staff_id'],
                            'set_date' => $master_data['set_date'],
                            'user_id' => $master_data['user_id'],
                            'master_id' => $master_id,
                            'reference_id' => $enum['enum_key'],
                            'checkout_status' => $enum['checked'],
                            'type' => 6,
                            'v1' => $enum['v1'], // 身高
                            'v2' => $enum['v2'], //体重
                            'store_id' => self::$storeId,
                            'create_by' => $create_by,
                        ];
                    }
                }
                if (!empty($new_enum_data)){
                    $enum_res = $this->addAll($new_enum_data);
                    if (!$enum_res) {
                        return false;
                    }
                }
            }
            $lack_res = $this->setManyData($lack_data,$master_data['set_date'],$master_data['staff_id'],$master_data['user_id'],$create_by,7,$master_id);
            if (!$lack_res) {
                return false;
            }
            $meal_res = $this->setManyData($meal_data,$master_data['set_date'],$master_data['staff_id'],$master_data['user_id'],$create_by,8,$master_id);
            if (!$meal_res) {
                return false;
            }
            $nutrition_res = $this->setManyData($nutrition_data,$master_data['set_date'],$master_data['staff_id'],$master_data['user_id'],$create_by,9,$master_id);
            if (!$nutrition_res) {
                return false;
            }
        });
        return true;
    }

    public function addMaseter(array $where = [],array $master_data,string $create_by) :int
    {
        $master_model = NutritionMealsModel::getOne($where);
        $master_id = !empty($master_model) ? $master_model['id'] : 0;
        if (empty($master_model)){
            $master_data['create_by'] = $create_by;
            $master_model = new NutritionMealsModel();
            if ($master_model->db()->getConnection() instanceof \app\common\database\Dm
                && !array_key_exists('food_allergy', $master_data)) {
                $master_data['food_allergy'] = '';
            }
        }
        if ($master_model->db()->getConnection() instanceof \app\common\database\Dm
            && array_key_exists('food_Intolerance', $master_data)) {
            $master_data['food_intolerance'] = $master_data['food_Intolerance'];
            unset($master_data['food_Intolerance']);
        }
        $master_res = $master_model->save($master_data);
        if (!$master_res){
            return 0;
        }
        if (empty($master_id)){
            $new_master_model = NutritionMealsModel::getOne($where);
            $master_id = $new_master_model['id'];
        }
        return $master_id;
    }

    public function setFood(int $staff_id,string $set_date,array $enum_data,string $other_text,
                            string $food_allergy,string $food_Intolerance,string $food_disable,string $create_by, int $user_id) : bool
    {
        $master_data = [
            'staff_id' => $staff_id,
            'set_date' => $set_date,
            'user_id' => $user_id,
            'type' => 11,
            'other_text' => $other_text,
            'store_id' => self::$storeId,
            'food_allergy' => $food_allergy,
            'food_Intolerance' => $food_Intolerance,
            'food_disable' => $food_disable,
        ];
        $this->transaction(function () use ($enum_data,$master_data,$create_by){
            $master_where = [
                'staff_id' => $master_data['staff_id'],
                'set_date' => $master_data['set_date'],
                'user_id' => $master_data['user_id'],
                'type' => 11
            ];
            $master_id = $this->addMaseter($master_where,$master_data,$create_by);
            $this->setManyData($enum_data,$master_data['set_date'],$master_data['staff_id'],$master_data['user_id'],$create_by,11,$master_id);
        });
        return true;
    }
    // 膳食调查设置
    public function setMeals(int $staff_id, string $set_date,array $enum_data,int $user_id,string $create_by,string $other_text): bool
    {
        $master_data = [
            'staff_id' => $staff_id,
            'set_date' => $set_date,
            'user_id' => $user_id,
            'type' => 10,
            'other_text' => $other_text,
            'store_id' => self::$storeId,
        ];
        $this->transaction(function () use ($enum_data,$master_data,$create_by){
            $master_where = [
                'staff_id' => $master_data['staff_id'],
                'set_date' => $master_data['set_date'],
                'user_id' => $master_data['user_id'],
                'type' => 10
            ];
            $master_id = $this->addMaseter($master_where,$master_data,$create_by);

            $delete_res = $this->where($master_where)->update(['is_delete' => 1]);
            if ($delete_res === false) {
                return false;
            }
            $new_data = [];
            foreach ($enum_data as $enum){
                $new_data[] = [
                    'staff_id' => $master_data['staff_id'],
                    'set_date' => $master_data['set_date'],
                    'user_id' => $master_data['user_id'],
                    'master_id' => $master_id,
                    'reference_id' => $enum['enum_id'],
                    'type' => 10,
                    'recommend' => $enum['recommend'], // 建议
                    'store_id' => self::$storeId,
                    'create_by' => $create_by,
                ];
            }
            $enum_res = $this->addAll($new_data);
            if (!$enum_res) {
                return false;
            }
        });
        return true;
    }

    // 批量设置
    public function setManyData(array $data,string $set_date,int $staff_id,int $user_id,string $create_by,int $type = 2,int $master_id =0):bool
    {
        $where = [
            'staff_id' => $staff_id,
            'set_date' => $set_date,
            'type' => $type,
            'user_id' => $user_id,
            'is_delete' => 0,
        ];
        $assignRelationIds = (new static)->where($where)->column('reference_id');
        $deleteRelationIds = array_diff($assignRelationIds, $data);
        if (!empty($deleteRelationIds)) {
            self::deleteAll([
                ['staff_id', '=', $staff_id],
                ['type', '=', $type],
                ['user_id','=', $user_id],
                ['set_date','=', $set_date],
                ['reference_id', 'in', $deleteRelationIds],
            ]);
        }
        $newRelationIds = array_diff($data, $assignRelationIds);
        $add_data = [];
        foreach ($newRelationIds as $relationId) {
            $add_data[] = [
                'staff_id' => $staff_id,
                'type' => $type,
                'user_id' => $user_id,
                'set_date' => $set_date,
                'master_id' => $master_id,
                'reference_id' => $relationId,
                'store_id' => self::$storeId,
                'create_by' => $create_by,
            ];
        }
        if (!empty($add_data)){
            $result = (new static)->addAll($add_data);
            if (!$result){
                return false;
            }
        }
        return true;
    }
    // 作废，不可用
    public function setNutritionLack(array $enum_data,string $create_by)
    {
        $enum_data['store_id'] = self::$storeId;
        $where = [
            'staff_id' => $enum_data['staff_id'],
            'set_date' => $enum_data['set_date'],
            'user_id' => $enum_data['user_id'],
            'type' => $enum_data['type'],
            'reference_id' => $enum_data['reference_id'],
            'is_delete' => 0,
        ];
        $model = self::getOne($where);
        if (empty($model)){
            $model = new static();
            $enum_data['create_by'] = $create_by;
        }
        $res = $model->save($enum_data);
        if (!$res) {
            return false;
        }
        return true;
    }
    // 获取已分配的健康状态
    public static function getRelationIdsByStaffId(int $staffId): array
    {
        return (new static)->where('staff_id', '=', $staffId)->column('health');
    }
}
