<?php
/**
 * Created by PhpStorm.
 * User: rlgyzhcn
 * Date: 18-5-31
 * Time: 上午9:56
 */

namespace backend\controllers;

use backend\models\coin\CoinForm;
use common\business\CoinBusiness;
use common\models\psources\Coin;
use common\models\psources\CoinPlatform;
use Yii;
use yii\validators\ImageValidator;
use yii\web\Response;
use yii\web\UploadedFile;

/**
 * 币种管理控制器
 * Class CoinController
 * @package backend\controllers
 */
class CoinController extends BaseController
{
    public function actionIndex()
    {
        if (Yii::$app->request->isAjax) {
            $request   = Yii::$app->request;
            $page      = $request->get('page', 1);
            $limit     = $request->get('limit', 10);
            $name      = $request->get('name', null);
            $platform  = $request->get('platform', '');
            $recommend = $request->get('recommend', '');

            $condition = [];

            if ($name) {
                $condition[] = ['like', 'name', $name];
            }
            if ($platform != '') {
                $condition[] = ['chain' => $platform];
            }
            if (Yii::$app->user->id != Yii::$app->params['admin']) {
                $platform_id = Yii::$app->user->identity->platform_id;
                $condition[] = ['>', "find_in_set($platform_id, platform_id)", 0];
            }
            if (!empty($recommend)) {
                //使用连表查询推荐币种
                $data = CoinBusiness::getRecommendList($page, $limit, $condition);
            } else {
                $data = CoinBusiness::getList($page, $limit, $condition);
            }
            $data['code'] = 0;
            //ajax return
            Yii::$app->response->format = 'json';
            return $data;

        }
        $platforms = Coin::getChainList();
        return $this->render('index', ['platforms' => $platforms]);
    }

    public function actionAdd()
    {
        $model           = new CoinForm();
        $model->scenario = 'add';
        if (Yii::$app->request->isPost) {
            $request = Yii::$app->request;
            if ($model->load($request->post()) && $model->validate()) {
                /**
                 * @var $coin \common\models\psources\Coin
                 */
                $coin = Yii::createObject(Coin::className());
                $data = array_merge($request->post(), ['platform_id' => Yii::$app->user->identity->platform_id]);
                unset($data['id']);
                $result = $coin->addOne($data);
                if ($result === true) {
                    $this->success('添加成功', '/admin/coin/index');
                }
            }
            //表单验证失败
            $errors = $model->errors;
            if ($errors) {
                foreach ($errors as $key => $item) {
                    $errors = $item[0];
                    break;
                }
            } elseif (isset($result) && $result['code'] != 0) {
                $errors = $result['message'];
            }
            $this->error($errors, Yii::$app->request->getReferrer());
        }
        return $this->render('add', ['model' => $model]);
    }

    public function actionEdit()
    {
        if (Yii::$app->request->isPost) {
            $model                      = new CoinForm();
            $model->scenario            = 'update';
            $req                        = Yii::$app->request;
            Yii::$app->response->format = 'json';
            if ($model->load($req->post()) && $model->validate()) {
                $platform_id = Yii::$app->user->identity->platform_id;

                $can = false;

                if (Yii::$app->params['admin'] != Yii::$app->user->id) {
                    $coin = Coin::find()->where(['id' => $req->post('id'), 'platform_id' => $platform_id])->one();
                    if ($coin) {
                        $can = true;
                    }
                } else {
                    $can = true;
                }
                if ($can) {
                    $coin   = Yii::createObject(Coin::className());
                    $result = $coin->updateOne($req->post());
                    if ($result === true) {
                        return ['code' => 0, 'msg' => 'succeed'];
                    }
                } else {
                    return ['code' => -1, 'msg' => '没有权限修改'];
                }
            }
            $errors = $model->errors;
            if ($errors) {
                foreach ($errors as $key => $item) {
                    $errors = $item[0];
                    break;
                }
            } elseif (isset($result) && $result['code'] != 0) {
                $errors = $result['message'];
            }
            return ['code' => 1, 'msg' => $errors];
        } elseif (Yii::$app->request->isGet) {
            $id = Yii::$app->request->get('id', null);
            if ($id) {
                $coin         = Coin::findOne(['id' => $id]);
                $this->layout = false;
                return $this->render('edit', ['model' => $coin]);
            }
        }
    }

    /**
     * 上传币种图标
     */
    public function actionUpload()
    {
        Yii::$app->response->format = 'json';

        $uploaded_file = UploadedFile::getInstanceByName('file');
        try {
            /**
             * @var $validator ImageValidator
             */
            $validator = Yii::createObject(ImageValidator::className(), ['extensions' => 'png,jpg,gif']);
            if ($validator->validate($uploaded_file)) {
                $src = Yii::$app->uploader->upload($uploaded_file);
                if ($src === false) {
                    return ['code' => 1, 'msg' => '上传失败'];
                } else {
                    return ['code' => 0, 'data' => ['src' => $src]];
                }
            }
        } catch (\Exception $exception) {
            return ['code' => $exception->getCode(), 'msg' => $exception->getMessage()];
        }
    }

    public function actionDelete()
    {
        Yii::$app->response->format = 'json';
        $id                         = Yii::$app->request->get('id', 0);
        if ($id) {
            $model = Coin::findOne(['id' => $id]);
            if ($model) {
                $platform_id = Yii::$app->user->identity->platform_id;
                $can         = false;

                if (Yii::$app->params['admin'] != Yii::$app->user->id) {
                    $coin = Coin::find()->where(['id' => $id, 'platform_id' => $platform_id])->one();
                    if ($coin) {
                        $can = true;
                    }
                } else {
                    $can = true;
                }
                if ($can) {
                    try {
                        $model->delete();
                        return ['code' => 0, 'msg' => 'succeed'];
                    } catch (\Throwable $t) {
                        return ['code' => $t->getCode(), 'msg' => $t->getMessage()];
                    }
                } else {
                    return ['code' => -1, 'msg' => '没有权限修改'];
                }
            }
        }
        return ['code' => -1, 'msg' => '删除失败'];
    }

    public function actionGetExchangeListById()
    {
        $id        = Yii::$app->request->get('id', 0);
        $exchanges = [];
        if ($id) {
            $exchanges = CoinBusiness::getExchangeListById($id);
        }
        $this->layout = false;
        return $this->render('exchange', ['exchanges' => $exchanges]);
    }

    public function actionPackage()
    {
        $user_platform_id = Yii::$app->user->identity->platform_id;

        if (Yii::$app->request->isAjax) {
            $get = Yii::$app->request->get();

            $page     = $get['page'] ?? 1;
            $limit    = $get['limit'] ?? 10;
            $name     = $get['name'] ?? '';
            $platform = $get['platform'] ?? '';
            $chain    = $get['chain'] ?? '';

            $condition = [];

            if ($name) {
                $condition[] = ['like', 'name', $name];
            }
            if ($platform) {
                $condition[] = ['platform' => $platform];
            }
            if ($chain) {
                $condition[] = ['chain' => $chain];
            }

            if (Yii::$app->user->id == Yii::$app->params['admin']) {
                $platform_id = $get['platform_id'] ?? '';
            } else {
                $platform_id = $user_platform_id;
            }

            if ($platform_id) {
                $condition[] = ['>', "find_in_set($platform_id, platform_id)", 0];
            }
            $data = Coin::getSelectList($page, $limit, ['id', 'name', 'nickname', 'platform', 'chain'], $condition);

            Yii::$app->response->format = Response::FORMAT_JSON;
            if (!empty($data)) {
                $data['code'] = 0;
            }
            return $data;
        }
        //获取币种平台
        $coin_platforms = Coin::getPlatformList();
        //获取主链
        $chains = Coin::getChainList();

        if (Yii::$app->user->id == Yii::$app->params['admin']) {
            $platforms = CoinPlatform::find()->asArray()->all();
        } else {
            $platforms = CoinPlatform::find()->where(['id' => $user_platform_id])->asArray()->all();
        }
        return $this->render('package', [
            'platforms'      => $platforms,
            'chains'         => $chains,
            'coin_platforms' => $coin_platforms,
        ]);
    }

    public function actionPackageDel()
    {
        if (Yii::$app->request->isAjax) {
            Yii::$app->response->format = Response::FORMAT_JSON;

            $id          = Yii::$app->request->get('id', '');
            $platform_id = Yii::$app->request->get('platform_id', '');
            if (empty($platform_id)) {
                return ['code' => -1, 'msg' => '请选择钱包'];
            }
            $user_platform_id = Yii::$app->user->identity->platform_id;

            $coin = Coin::findOne($id);
            if ($coin) {
                $can = false;

                $platform_ids = explode(',', $coin->platform_id);

                if (Yii::$app->user->id == Yii::$app->params['admin']) {
                    $can = true;
                } else {
                    if (in_array($user_platform_id, $platform_ids) && $platform_id == $user_platform_id) {
                        $can = true;
                    }
                }
                if ($can) {
                    //删除
                    $platform_ids      = array_diff($platform_ids, [$platform_id]);
                    $platform_ids      = implode(',', $platform_ids);
                    $coin->platform_id = $platform_ids;
                    if ($coin->save()) {
                        return ['code' => 0, 'msg' => '删除成功'];
                    }
                    return ['code' => -1, 'msg' => '删除失败'];
                } else {
                    return ['code' => -1, 'msg' => '没有权限修改'];
                }

            } else {
                return ['code' => -1, 'msg' => '币种不存在'];
            }
        }
    }

    public function actionPackageAdd()
    {
        if (Yii::$app->request->isAjax) {
            Yii::$app->response->format = Response::FORMAT_JSON;

            $get         = Yii::$app->request->get();
            $platform_id = $get['platform_id'] ?? '';
            $name        = $get['name'] ?? '';
            $chain       = $get['chain'] ?? '';
            foreach (['platform_id' => '平台', 'name' => '币种名称', 'chain' => '币种主链'] as $key => $value) {
                if (empty($$key)) {
                    return ['code' => -1, 'msg' => $value . '不能为空'];
                }
            }

            $coin = Coin::find()->where(['name' => $name, 'chain' => $chain])->One();
            if ($coin) {
                $can              = false;
                $user_platform_id = Yii::$app->user->identity->platform_id;
                $platform_ids     = explode(',', $coin->platform_id);

                if ($user_platform_id == Yii::$app->params['admin']) {
                    $can = true;
                } else {
                    if (in_array($user_platform_id, $platform_ids) && $platform_id == $user_platform_id) {
                        $can = true;
                    }
                }
                if ($can) {
                    $platform_ids = implode(',', array_unique(array_merge($platform_ids, [$platform_id])));
                    $coin->platform_id = $platform_ids;
                    if ($coin->save()) {
                        return ['code' => 0, 'msg' => '添加成功'];
                    }
                    return ['code' => -1, 'msg' => '添加失败'];
                }
                return ['code' => -1, 'msg' => '没有权限修改'];
            }
            return ['coin' => -1, 'msg' => '币种不存在'];
        }
    }
}