<?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;

/**
 * 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){
                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()));
                    }
                    
//                    $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 {
                    throw new Exception('报单数据格式错误');
                }
            }
            
            // 把这几个首购单的注册用户点位绑定到一起
//            UserBind::zcBind($allZcUserIds, $zcUserIdCard);
//            if((microtime(true) - $startTime) >= 20)  {
//                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;
    }
}
