<?php
/**
 * Created by PhpStorm.
 * User: leo
 * Date: 2018/2/24
 * Time: 下午12:48
 */

namespace frontendApi\modules\v1\controllers;

use common\helpers\Cache;
use common\helpers\Form;
use common\helpers\Tool;
use common\helpers\user\Info;
use common\models\BaUserInfo;
use common\models\Config;
use common\models\DeclarationLevel;
use common\models\DeclarationPackage;
use common\models\DecOrder;
use common\models\forms\ApproachDeclarationLoopForm;
use common\models\forms\ApproachDeclarationUpgradeForm;
use common\models\forms\DeclarationForm;
use common\models\forms\DeclarationLoopForm;
use common\models\forms\UploadForm;
use common\models\forms\UserBindForm;
use common\models\forms\UserForm;
use common\models\OpenBank;
use common\models\ReceiveAddress;
use common\models\Region;
use common\models\ShopGoods;
use common\models\UpgradeType;
use common\models\User;
use common\models\UserBind;
use common\models\UserInfo;
use common\models\UserNetwork;
use common\models\forms\DeclarationUpgradeForm;
use Yii;
use yii\db\Exception;
use yii\web\UploadedFile;

class BaController extends BaseController {
    public $modelClass = BaUserInfo::class;

    /**
     * 会员资料
     * @return mixed
     * @throws \yii\web\HttpException
     */
    public function actionIndex() {
        $allNation = \Yii::$app->params['nation'];
        $allOpenBank = OpenBank::findAllAsArray('STATUS=1');
        $data['allNation'] = $allNation;
        $data['allOpenBank'] = $allOpenBank;
        $data['userInfo'] = User::getEnCodeInfo(\Yii::$app->user->id);
        $data['userInfo']['NATION'] = $data['userInfo']['NATION_ID'];
        return static::notice($data);
    }

    /**
     * 编辑会员资料
     * @return mixed
     * @throws \yii\web\HttpException
     */
    public function actionEdit() {
        if(\Yii::$app->request->isPost){
            $form = new UserForm();
            $post = \Yii::$app->request->post();
            $form->scenario = 'modifyProfile';
            if($form->load($post, '') && $result = $form->modifyProfile()){
                return static::notice(Yii::t('app', 'personalDataModifiedSuccessfully'));
            } else {
                return static::notice(Form::formatErrorsForApi($form->getErrors()), 400);
            }
        }
        return static::notice(Yii::t('app', 'illegalRequest'), 400);
    }

    /**
     * 修改登录密码
     */
    public function actionPassword(){
        if(\Yii::$app->request->isPost){
            $form = new UserForm();
            $form->scenario = 'modifyPassword';
            $post = \Yii::$app->request->post();
            if($form->load($post, '') && $result = $form->modifyPassword()){
                return static::notice(Yii::t('app', 'passwordModifiedSuccessfully'));
            } else {
                return static::notice(Form::formatErrorsForApi($form->getErrors()), 400);
            }
        }
        return static::notice(Yii::t('app', 'illegalRequest'), 400);
    }

    /**
     * 修改支付密码
     */
    public function actionPayPassword(){
        if(\Yii::$app->request->isPost){
            $form = new UserForm();
            $form->scenario = 'modifyPasswordPay';
            $post = \Yii::$app->request->post();
            $form->userId = \Yii::$app->user->id;
            if($form->load($post, '') && $result = $form->modifyPasswordPay()){
                return static::notice(Yii::t('app', 'passwordModifiedSuccessfully'));
            } else {
                return static::notice(Form::formatErrorsForApi($form->getErrors()), 400);
            }
        }
        return static::notice(Yii::t('app', 'illegalRequest'), 400);
    }

    /**
     * 直推会员列表
     * @return mixed
     * @throws \yii\web\HttpException
     */
    public function actionRecUser() {
        $allData = UserInfo::lists('AND REC_UID=:REC_UID', [':REC_UID' => \Yii::$app->user->id], ['useSlaves' => true, 'select'=>'USER_ID,CREATED_AT']);
        foreach ($allData['list'] as $key => $data) {
            $userBaseInfo = User::getEnCodeInfo($data['USER_ID']);
            $userBaseInfo['NATION'] = \Yii::$app->params['nation'][$userBaseInfo['NATION']]['name'] ?? '';
            $allData['list'][$key]['BASE_INFO'] = $userBaseInfo;
        }
        return static::notice($allData);
    }

    /**
     * 上传身份证
     * @return mixed
     * @throws \yii\base\Exception
     * @throws \yii\web\HttpException
     */
    public function actionIdCard() {
        if (\Yii::$app->request->isPost) {
            $formModel = new UploadForm();
            $formModel->scenario = 'idCardFront';
            $formModel->file = UploadedFile::getInstanceByName('file');
            //$formModel->token = \Yii::$app->request->post('uploadToken');
            $formModel->token = \Yii::$app->request->request('uploadToken');
            if ($formModel->file && $formModel->upload()) {
                return static::notice(Yii::t('app', 'successfully'));
            } else {
                return static::notice(Form::formatErrorsForApi($formModel->getErrors()), 400);
            }
        }
        // 查看该用户是否已经上传过身份证
        $oneData = User::find()->select('ID_IMAGE')->where('ID=:ID', [':ID' => \Yii::$app->user->id])->asArray()->one();
        if ($oneData['ID_IMAGE']) {
            return static::notice($oneData);
        } else {
            $token = Cache::setUploadToken();
            return static::notice($token);
        }
    }

    /**
     * 点位绑定
     * @return mixed
     * @throws \yii\base\Exception
     * @throws \yii\web\HttpException
     */
    public function actionBind() {
        $userBind = UserBind::findOneAsArray('USER_ID=:USER_ID AND IS_DEL=0', [':USER_ID' => \Yii::$app->user->id]);
        $allData['list']=UserBind::findAllAsArray('MAIN_UID=:MAIN_UID AND IS_DEL=0', [':MAIN_UID' => $userBind['MAIN_UID']], 'ID,USER_ID,MAIN_UID,CREATED_AT,UPDATED_AT');
        foreach ($allData['list'] as $key => $value) {
            $baseInfo = Info::baseInfoZh($value['USER_ID']);
            if ($baseInfo['STATUS'] != 1) {
                unset($allData['list'][$key]);
                continue;
            }
            $allData['list'][$key]['USER_NAME'] = $baseInfo['USER_NAME'];
            $allData['list'][$key]['REAL_NAME'] = $baseInfo['REAL_NAME'];
            $allData['list'][$key]['BANK_PROVINCE_NAME'] = $baseInfo['BANK_PROVINCE_NAME'];
            $allData['list'][$key]['BANK_CITY_NAME'] = $baseInfo['BANK_CITY_NAME'];
            $allData['list'][$key]['BANK_COUNTY_NAME'] = $baseInfo['BANK_COUNTY_NAME'];
            $allData['list'][$key]['OPEN_BANK_NAME'] = $baseInfo['OPEN_BANK_NAME'];
            $allData['list'][$key]['BANK_NO'] = $baseInfo['BANK_NO'];
            $allData['list'][$key]['MAIN_USER_NAME'] =Info::getUserNameByUserId($value['MAIN_UID']);
        }
        $allData['list'] = array_values($allData['list']);
        return static::notice($allData);
    }

    /**
     * 编辑点位绑定
     * @return mixed
     * @throws \yii\web\HttpException
     */
    public function actionBindEdit(){
        $id = \Yii::$app->request->get('id');
        if(\Yii::$app->request->isPost) {
            return parent::edit(UserBindForm::class, Yii::t('app', 'successfully'), 'frontEdit', ['frontEdit'], null, function($form, $result){
                //log
            });
        }
        // 获得当前会员的用户名等信息
        $userBind = UserBind::findOneAsArray('ID=:ID AND IS_DEL=0', [':ID' => $id]);
        $userBinds = UserBind::findAllAsArray('MAIN_UID=:MAIN_UID AND IS_DEL=0',[':MAIN_UID'=>$userBind['MAIN_UID']], 'ID,USER_ID,MAIN_UID,CREATED_AT,UPDATED_AT');
        foreach($userBinds as $key=>$value){
            $status = Info::getStatusByUserId($value['USER_ID']);
            if ($status != 1) {
                unset($userBinds[$key]);
                continue;
            }
            $userBinds[$key]['USER_NAME'] = Info::getUserNameByUserId($value['USER_ID']);

        }
        $userBinds = array_values($userBinds);
        return static::notice(['userBinds' => $userBinds,'mainUid'=>$userBind['MAIN_UID']]);
    }

    // 会员升级,通过会员的编号,获取会员信息
    public function actionUpgradeInfo() {
        $isSwitchUpgrade = Config::find()
        ->where("CONFIG_NAME='isOpenUpgrade'")
        ->asArray()
        ->one();
        $isOpen = !empty($isSwitchUpgrade) && isset($isSwitchUpgrade['VALUE']) ? $isSwitchUpgrade['VALUE'] : 0;
        if ($isOpen < 1) {
            return static::notice(Yii::t('app', 'theFunctionIsNotAvailable'), 400);
        }
        $userNumber = \Yii::$app->request->request('userName');
        $baseInfo = Info::baseInfoZhByUserName($userNumber);
        if ($baseInfo['STATUS'] != 1) {
            return static::notice(Yii::t('app', 'inactiveUser'), 400);
        }
        // 1. 如果是最高级别,则只显示用户基本信息
        // 2. 如果不是最高级别,如果用户累计报单数据是0, 或者用户累计报单业绩不符合级别信息,则提示 请联系客服核对业绩
        $userId = $baseInfo['ID'];
        $userDecId = $baseInfo['DEC_LV'];// 用户当前的级别
        // 获取系统中的DEC 报单级别配置
        $decConfig = Cache::getDecLevelConfig();
        $userDecInfo = $decConfig[$userDecId]; // 会员的级别具体信息
        $maxPerfInfo = DeclarationLevel::getMaxDecPref();
        $maxDecId = $maxPerfInfo['ID']; // 级别配置中最高级别ID
        $observe = Config::getConfigByType('observe'); // 获取观察期配置信息
        $observeLimit = $observe['observePeriodLimit']['value']; // 月份限制
        $isObserve = User::checkIsObserve($baseInfo['CREATED_AT'], $observeLimit); // 判断用户是否再观察期中
        // 如果用户已经是最高级别,则只展示用户信息
        $isMax = false;
        if ($maxDecId == $userDecId) {
            $isMax = true;
        }
        // 如果用户已经是最高级别,则只展示用户信息
        $userInfo = [
            'DEC_NAME' => $baseInfo['DEC_LV_NAME'], // 用户级别中文
            'DEC_ID' => $userDecId, // 用户级别id
            'REAL_NAME' => $baseInfo['REAL_NAME'], // 真实姓名
            'ADD_AT' => date('Y-m-d', $baseInfo['CREATED_AT']), // 加入时间
            'IS_OBSERVE' => $isObserve, // 是否是观察期  true为是观察期
            'IS_MAX' => $isMax, // 是否已是最大级别 最大级别不需要判断报单总PV是多少 只展示基本信息
        ];

        // 如果是最高级别了,则无需升级
        if ($isMax) {
            return static::notice(['baseInfo' => $userInfo]);
        }

        $levelPerf = $userDecInfo['PERF'];// 用户当前级别对应的业绩值
        if (!$isMax) {
            $userDecPvSum = User::sumDevPvByUserId($userId); // 用户所有报单PV总和
            // // 如果总和小于级别业绩 去掉这校验直接补比如3000-980的差值
            // if ($userDecPvSum < $levelPerf) {
            //     return static::notice('请联系客服人员核对业绩',400);
            // }
            // 下一级业绩
            $nextLevelPerf = DeclarationLevel::getNextDecPref($levelPerf)['PERF'];
            // 如果总和超过了下一级业绩
            if ($userDecPvSum >= $nextLevelPerf) {
                return static::notice(Yii::t('app', 'checkPerformance'), 400);
            }
            $type = $isObserve ? 1 : 2;
            $userInfo['UPGRADE_FUNC'] = $isObserve ? Yii::t('app', 'fillingUpOfADeficit') : Yii::t('app', 'fullPayment');// 升级方式
            $upgradeType = UpgradeType::getOneByType($type);
            // 如果用户不是最大级别,则需要获取是否观察期,算出PV是否有问题,应该补多少,
            $userInfo['UPGRADE_TYPE'] = $upgradeType;
            $userInfo['NOW_PERF'] = $userDecPvSum;
            $userInfo['NEXT_PERF'] =  $nextLevelPerf;
            // 用户可选择的级别列表
            $userInfo['LEVEL_LIST'] = DeclarationLevel::getNextAll($levelPerf);// 用户可选择的级别列表
            // 循环列表,补充升级所需要的补差
            foreach ($userInfo['LEVEL_LIST'] as &$v) {
                $v['REPAIR_PV'] = $isObserve ? $v['PERF'] - $userInfo['NOW_PERF'] : $v['PERF'];
            }
        }

        return static::notice(['baseInfo' => $userInfo]);
    }

    // 会员升级管理
    public function actionUpgrade() {
        $isSwitchUpgrade = Config::find()
        ->where("CONFIG_NAME='isOpenUpgrade'")
        ->asArray()
        ->one();
        $isOpen = !empty($isSwitchUpgrade) && isset($isSwitchUpgrade['VALUE']) ? $isSwitchUpgrade['VALUE'] : 0;
        if ($isOpen < 1) {
            return static::notice(Yii::t('app', 'theFunctionIsNotAvailable'), 400);
        }
        // 开始升级
        if (\Yii::$app->request->isPost) {
            $post = \Yii::$app->request->post();
            // 根据支付方式区分逻辑
            $payMethod = \Yii::$app->request->post('payType', '');
            if ($payMethod === 'pay_stack') {
                $formModel = new ApproachDeclarationUpgradeForm();
            } else {
                unset($post['payType']);
                $formModel = new DeclarationUpgradeForm();
            }

            $post['type'] = DeclarationForm::TYPE_ZC;
            if ($formModel->load($post, '') && $result = $formModel->add($post)) {
                return static::notice($result);// Upgrade declaration succeeded升级报单成功
            } else {
                return static::notice(Form::formatErrorsForApi($formModel->getErrors()),400);
            }
        }

        //所有报单套餐
        $allDecPackage = DeclarationPackage::getAllData();
        $decLevels = Cache::getDecLevelConfig();
        foreach ($allDecPackage as $k=>$v){
            $levelName = $decLevels[$v['LEVEL_ID']]['LEVEL_NAME'] ?? '';
            $allDecPackage[$k]['LEVEL_NAME'] = $levelName;
        }
        //所有自选商品
        $isDecReg = Cache::getSystemConfig()['isDecReg']['VALUE'];
        $isDec = User::getEnCodeInfo(\Yii::$app->user->id)['IS_DEC'];
        $isStudio = User::getEnCodeInfo(\Yii::$app->user->id)['IS_STUDIO'];
        $decUserName = User::getEnCodeInfo(\Yii::$app->user->id)['USER_NAME'];
        $query_condition= " AND (1<>1";
        if(!$isDecReg || ($isDecReg && $isDec==1)){
            $query_condition = " AND (FIND_IN_SET(1,GIFT_TYPE)>0";
        }
        if($isStudio==1){
            $query_condition.= " OR FIND_IN_SET(3,GIFT_TYPE)>0";
        }
        $query_condition.= ")";

        $allGoods = ShopGoods::find()->where("STATUS=1 AND CATEGORY_TYPE=1 " . $query_condition)->orderBy('SORT ASC')->asArray()->all();
        foreach ($allGoods as &$goods) {
            $goods['TAX'] = Tool::calculateTax($goods['SELL_PRICE'], $goods['TAX_RATE']);
        }

        return static::notice([
            'allDecPackage' => $allDecPackage,
            'allGoods' => $allGoods,
            'decUserName'=>$decUserName,
            'payList' => ShopGoods::payTypes(),
            'sellType' => ShopGoods::getCategoryType(),
            'categoryType' => ShopGoods::getCategoryType()[0]['id'],
        ]);
    }

    /**
     * 报单管理
     */
    public function actionDec() {
        // 生成随机码 , 初始化redis
        $userName = Info::generateWebUserName('NG',9);
        $redis = \Yii::$app->redis;
        $post = \Yii::$app->request->post();

        if (\Yii::$app->request->isPost) {
            // 根据支付方式区分逻辑
            $payMethod = \Yii::$app->request->post('payType', '');

            if ($payMethod === 'pay_stack') {
                $formModel = new ApproachDeclarationLoopForm();
            } else {
                unset($post['payType']);
                $formModel = new DeclarationLoopForm();
            }

            $formModel->scenario = 'userDec';

            $post['province'] = $post['province'] ? :1;
            $post['city'] = $post['city'] ? :1;
            $post['county'] = $post['county'] ? :1;
            $post['conUserName'] = trim($post['conUserName']);
            $post['recUserName'] = trim($post['recUserName']);
            $post['cityName'] = trim($post['cityName']);
            $post['lgaName'] = trim($post['lgaName']);

            // 针对于会员编号的判断
            $insertUserName = strtoupper($post['insertUserName']);
            $getRedisUserName = $redis->get('key_' . $insertUserName);
            if (!$getRedisUserName){
                return static::notice(Yii::t('app', 'memberNumberExpired'), 400);
            }
            if ($insertUserName != $getRedisUserName){
                return static::notice(Yii::t('app', 'memberNumberDoesNotConformTo'), 400);
            }

            $post['insertUserName'] = $insertUserName;
            $post['type'] = DeclarationForm::TYPE_ZC;
            $allData['data'][] = $post;
            if ($formModel->load($allData, '') && $result = $formModel->add()) {
                return static::notice($result);//报单成功
            } else {
                return static::notice(Form::formatErrorsForApi($formModel->getErrors()),400);
            }
        }

        //所有报单套餐
        $allDecPackage = DeclarationPackage::getAllData();
        $decLevels = Cache::getDecLevelConfig();
        foreach ($allDecPackage as $k=>$v){
            $levelName = $decLevels[$v['LEVEL_ID']]['LEVEL_NAME'] ?? '';
            $allDecPackage[$k]['LEVEL_NAME'] = $levelName;
        }
        //所有自选商品
        $isDecReg = Cache::getSystemConfig()['isDecReg']['VALUE'];
        $isDec = User::getEnCodeInfo(\Yii::$app->user->id)['IS_DEC'];
        $isStudio = User::getEnCodeInfo(\Yii::$app->user->id)['IS_STUDIO'];
        $query_condition= " AND (1<>1";
        if(!$isDecReg || ($isDecReg && $isDec==1)){
            $query_condition = " AND (FIND_IN_SET(1,GIFT_TYPE)>0";
        }
        if($isStudio==1){
            $query_condition.= " OR FIND_IN_SET(3,GIFT_TYPE)>0";
        }
        $query_condition.= ")";
        // 只查询普通商品
        $allGoods = ShopGoods::find()->where("STATUS=1 AND CATEGORY_TYPE=1".$query_condition)->orderBy('SORT ASC')->asArray()->all();

        //$allGoods = ShopGoods::findAllAsArray('STATUS=1');
        // 所有开户行
        $allOpenBank = OpenBank::find()->where('STATUS=1')->orderBy('LIST_ORDER ASC')->asArray()->all();
        if (!$userName) {
            return static::notice(Yii::t('app', 'failedToGenerateMemberNumber'), 400);
        }
        //随机码保存在redis中方便进行比对
        $redis->setex('key_'.$userName , 3600 , $userName);

        return static::notice([
            'allDecPackage' => $allDecPackage,
            'allGoods' => $allGoods,
            'allOpenBank' => $allOpenBank,
            'userName' => $userName,
            'payList' => ShopGoods::payTypes(),
            'sellType' => ShopGoods::getCategoryType(),
            'categoryType' => ShopGoods::getCategoryType()[0]['id'],
            ]);
    }

    /**
     * 报单级别套餐
     */
    public function actionDecPackage() {
        $decLv = \Yii::$app->request->get('id');
        //所有报单级别套餐
        $allDecPackage = DeclarationPackage::getPackageFromLevelId($decLv);
        return static::notice(['allDecPackage' => $allDecPackage]);

    }

    /*
     * 从会员名和左右，获取底部安置人
     *
     */
    public function actionGetAutoPlace() {
        $userName = \Yii::$app->request->get('userName');
        $side = \Yii::$app->request->get('side');
        $userId = Info::getUserIdByUserName($userName);
//        print_r($userId);
        $bottomPlace = UserNetwork::getBottomPlace($userId,'', $side);
        $bottomUser = UserNetwork::find()->select('USER_ID')->where('LOCATION_TAG=:LOCATION_TAG', ['LOCATION_TAG' => $bottomPlace])->asArray()->one();
        $bottomUser = User::findOneAsArray('ID=:ID', [':ID' => $bottomUser['USER_ID']], 'USER_NAME');
//        print_r($bottomUser);
        return static::notice($bottomUser);
    }

    /**
     * 会员信息查询
     * @return mixed
     * @throws \yii\web\HttpException
     */
    public function actionFullInfo()
    {
        $userName = \Yii::$app->request->get('userName');
        $userId = Info::getUserIdByUserName($userName);
        $userInfo['REAL_NAME'] = '';
        $user = User::findOneAsArray('ID=:ID', [':ID' => $userId], 'REAL_NAME');
        if($user){
            $userInfo['REAL_NAME'] = $user['REAL_NAME'];
            $allChildUser = UserNetwork::getFirstFloorChildren($userId);
            $isLocation = [1 => 'Left-', 2 => 'Right-'];
            if($allChildUser) {
                foreach ($allChildUser as $child) {
                    if ($child['RELATIVE_LOCATION']<'3'){
                        $isLocation[$child['RELATIVE_LOCATION']].= 'Full';
                    }
                }
            }
            $userInfo['isLocation'] = '('.implode(',',$isLocation).')';
            return static::notice($userInfo);
        }else{
            return static::notice(Yii::t('app', 'memberNumberDoesNotExist'), 400);
        }
    }

    /**
     * 复消会员信息查询
     * @return mixed
     * @throws \yii\web\HttpException
     */
    public function actionUserBaseInfo()
    {
        $userName = \Yii::$app->request->get('userName');
        $userId = Info::getUserIdByUserName($userName);
        if($userId){
            $allAddress = ReceiveAddress::findAllAsArray('USER_ID=:USER_ID', [':USER_ID'=>$userId]);
            if($allAddress) {
                foreach ($allAddress as $key => $row) {
                    $allAddress[$key]['PROVINCE_NAME'] = Region::getCnName($row['PROVINCE']);
                    $allAddress[$key]['CITY_NAME'] = Region::getCnName($row['CITY']);
                    $allAddress[$key]['COUNTY_NAME'] = Region::getCnName($row['COUNTY']);
                }
            }

            $userInfo = Info::baseInfoWithNet($userId);
//            $decLevelConfig = Cache::getDecLevelConfig();
//            $empLevelConfig = Cache::getEmpLevelConfig();

            $arr = [
                'REAL_NAME'=>$userInfo['REAL_NAME'],
//                'DEC_LEVEL_NAME' => $decLevelConfig[$userInfo['DEC_LV']]['LEVEL_NAME'],
//                'EMP_LEVEL_NAME'=>$empLevelConfig[$userInfo['EMP_LV']]['LEVEL_NAME'],
//                'REC_UID'=>$userInfo['REC_USER_NAME'].'('.$userInfo['REC_REAL_NAME'].')',
//                'CON_UID'=>$userInfo['CON_USER_NAME'].'('.$userInfo['CON_REAL_NAME'].')',
                'allAddress'=>$allAddress
            ];
            return static::notice($arr);
        }else{
            return static::notice(Yii::t('app', 'repeatSalesMemberNoDoesNotExist'), 400);
        }
    }

    /**
     * 会员资料
     * @return mixed
     * @throws \yii\web\HttpException
     */
    public function actionBaInfo()
    {
        $allNation = \Yii::$app->params['nation'];
        $allOpenBank = OpenBank::findAllAsArray('STATUS=1');
        $data['allNation'] = $allNation;
        $data['allOpenBank'] = $allOpenBank;
        $data['userInfo'] = User::getEnCodeInfo(\Yii::$app->user->id);  // TODO
        $data['userInfo']['NATION'] = $data['userInfo']['NATION_ID'];
        return static::notice($data);
    }

    /**
     * 编辑会员资料
     * @return mixed
     * @throws \yii\web\HttpException
     */
    public function actionBaEdit()
    {
        if(\Yii::$app->request->isPost)
        {
            $form = new UserForm();
            $post = \Yii::$app->request->post();
            $form->scenario = 'modifyProfile';
            if ($form->load($post, '') && $result = $form->modifyProfile()){
                return static::notice(Yii::t('app', 'personalDataModifiedSuccessfully'), 400);
            } else {
                return static::notice(Form::formatErrorsForApi($form->getErrors()), 400);
            }
        }

        return static::notice(Yii::t('app', 'illegalRequest'), 400);
    }
}
