<?php
namespace common\models\forms;

use common\components\Model;
use common\helpers\Form;
use common\models\UserBind;
use yii\base\Exception;
use yii\helpers\Json;
use common\models\DeclarationPackage;
use common\helpers\Date;
use common\models\ShopGoods;

/**
 * Login form
 */
class DeclarationLoopForm extends Model
{
    public $data;

    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [['data'], 'required'],
            [['data'], 'formatData'],
            [['data'], 'isData', 'on'=>['canDec', 'notFull']],
        ];
    }

    public function attributeLabels()
    {
        return [
            'data' => '数据',
        ];
    }

    /**
     * 指定场景
     * @return array
     */
    public function scenarios()
    {
        $parentScenarios =  parent::scenarios();
        $customScenarios = [
            'userDec' => ['data'],
            'canDec' => ['data'],
            'notFull' => ['data'],
        ];
        return array_merge($parentScenarios, $customScenarios);
    }

    /**
     * 格式化提交的数据
     * @param $attribute
     */
    public function formatData($attribute){
        //$this->data = Json::decode($this->data);
        if(!is_array($this->data)){
            $this->addError($attribute, '数据格式错误');
        }
    }

    /**
     * 循环校验数据是否合格
     * @param $attribute
     */
    public function isData($attribute){
        $model = new DeclarationForm();
        $model->scenario = $this->scenario;
        $model->allData = $this->data;
        foreach ($this->data as $value){
            if(is_array($value)){
                foreach($value as $key=>$decFormData){
                    $model->$key = $decFormData;
                }
                if(!$model->validate()){
                    $this->addErrors($model->getErrors());
                }
                $model->type = null;
                $model->decSn = null;
                $model->userId = null;
                $model->toUserId = null;
                $model->decPv = null;
                $model->insertUserName = null;
                $model->insertUserIdCard = null;
                $model->conUserName = null;
                $model->recUserName = null;
                $model->location = null;
            } else {
                $this->addError($attribute, '报单数据格式错误');
            }

        }
    }

    /**
     * 报单
     * @return bool
     * @throws \yii\db\Exception
     */
    public function add(){
        $startTime = microtime(true);
        if(!$this->validate()){
            return null;
        }
        $db = \Yii::$app->db;
        $transaction = $db->beginTransaction();
        try{
            // 所有的首购单会员ID以备点位绑定使用
            $allZcUserIds = [];
            $zcUserIdCard = null;
            $model = new DeclarationForm();
            $model->scenario = $this->scenario;

            $model->allData = $this->data;
            foreach ($this->data as $value){
                /**
                 * 2022-04-29
                 * York
                 * 获取商品套餐信息
                 */
                if (isset($value['packageId']) && $value['packageId']){
                    $packagedata = DeclarationPackage::findOneAsArray('ID=:ID', [':ID' => $value['packageId']]);
                    if (!$packagedata) {
                        throw new Exception('商品不存在');
                    }
                    //var_dump($packagedata['ID']);
                    if($packagedata['STORE_NUMS']<=0){
                        throw new Exception($packagedata['PACKAGE_NAME'].'库存不足');
                    }
                }

                if (count($value['goodsId']) > 0 && (count($value['goodsId']) == count($value['goodsNum']))){
                    for ($i=0;$i<count($value['goodsId']);$i++){
                        $goods = ShopGoods::findOneAsArray('ID=:ID',[':ID'=> $value['goodsId'][$i]]);
                        if (!$goods) {
                            throw new Exception('商品已下架');
                            return;
                        }
                        if ($goods['STATUS'] == 1 ){
                            if($goods['STORE_NUMS'] < $value['goodsNum'][$i]){
                                throw new Exception($goods['GOODS_NAME'].'商品库存不足');
                            }
                        }else{
                            throw new Exception($goods['GOODS_NAME'].'商品已下架');
                        }
                    }
                }

                if(is_array($value)){
                    foreach($value as $key=>$decFormData){
                        $model->$key = $decFormData;
                    }
                    // 把首购单的几个会员归集到一个数组里，将来绑定到一起
                    if( $model->type == 'ZC'){
                        $allZcUserIds[] = null;
                        if($zcUserIdCard != null){
                            if($model->insertUserIdCard != $zcUserIdCard){
                                throw new Exception('批量报单会员必须是同一身份证');
                            }
                        } else {
                            $zcUserIdCard = $model->insertUserIdCard;
                        }
                    }
                    if(!$model->add($this->data)){
                        throw new Exception(Form::formatErrorsForApi($model->getErrors()));
                    }
                } else {
                    throw new Exception('报单数据格式错误');
                }
            }

            $transaction->commit();
        } catch (\Exception $e){
            $transaction->rollBack();
            $this->addError('add', $e->getMessage());
            return null;
        }
        return true;
    }

    /**
     * RPC服务校验数据
     * @param $data
     * @return array
     */
    public static function rpcIsData($data){
        $result = [
            'error' => false,
            'message' => '数据可报单',
        ];
        $formModel = new self();
        $formModel->scenario = 'canDec';
        $formModel->data = $data;
        if(!$formModel->validate()){
            $result['error'] = true;
            $result['message'] = Form::formatErrorsForApi($formModel->getErrors());
        }
        return $result;
    }
}
