<?php

namespace api\controllers;

use common\models\psources\CoinPlatformWithHold;
use Yii;
use api\base\BaseController;
use common\business\ExchangeBusiness;
use common\models\psources\WalletCoin;
use common\models\psources\CoinCurrency;
use common\models\psources\WalletCoinRelation;

class WalletCoinController extends BaseController
{
    /**
     * 币种列表
     * @param array names
     * @return array
     */
    public function actionIndex()
    {
        $header = Yii::$app->request->headers;
        $platform_id = $header['FZM-PLATFORM-ID'] ?? null;
        $names = Yii::$app->request->post('names', '');
        if (false == $names || false == $platform_id) {
            $this->code = -1;
            $this->msg = '参数错误';
            goto doEnd;
        }

        foreach ($names as $key => $val) {
            if (strpos($val, ',') !== false) {
                $val_array = explode(',', $val);
                if ('USDT' == strtoupper($val_array[0]) && 'BTC' == strtoupper($val_array[1])) {
                    $condition[] = [$val_array[0], 'omni'];
                    continue;
                }
                //张雄需求
                if ('HYS' == strtoupper($val_array[0]) && 'HYSCHAIN' == strtoupper($val_array[1])) {
                    $condition[] = [$val_array[0], 'COINUN'];
                    continue;
                }
                $condition[] = [$val_array[0], $val_array[1]];
            } else {
                $condition[] = $val;
            }
        }
        $this->data = [];

        foreach ($condition as $val) {
            if (is_array($val)) {
                $model = WalletCoin::find()->select('id,icon,name,nickname,optional_name,introduce,platform,chain,address as contract_address,treaty')
                    ->where(['name' => $val[0], 'platform' => $val[1]])
                    ->andWhere("JSON_CONTAINS(platform_id,'$platform_id')")
                    ->asArray()
                    ->one();
            }

            if (is_string($val)) {
                $model = WalletCoin::find()->select('id,icon,name,nickname,optional_name,introduce,platform,chain,address as contract_address,treaty')
                    ->where(['name' => $val])
                    ->andWhere("JSON_CONTAINS(platform_id,'$platform_id')")
                    ->asArray()
                    ->one();
            }
            if (!empty($model)) {
                $lock = CoinPlatformWithHold::find()->select('lock')->where(['platform' => $model['platform']])->asArray()->one();
                $model['lock'] = (int)$lock['lock'];
                $this->data = array_merge($this->data, [$model]);
            }
        }

        if (empty($this->data)) {
            goto doEnd;
        }

        $chains = array_column($this->data, 'chain');
        $symbol = array_column($this->data, 'name');
        $chains_symbols = array_keys(array_flip($chains) + array_flip($symbol));
        $coin_quotations = ExchangeBusiness::getQuatationByNames($chains_symbols);

        $last[] = $rate[] = 1;
        $currency = CoinCurrency::find()->where(['pj_id' => $this->currency_id])->one();
        if (false != $currency) {
            $rate = Yii::$app->redis_currency->hmget('quotation_currency_' . 'CNY_' . $currency->symbol, 'last');
            $last = Yii::$app->redis_currency->hmget('quotation_currency_' . 'USD_' . $currency->symbol, 'last');
        }

        $ticker = ['low' => 0, 'high' => 0, 'last' => 0, 'open' => 0, 'vol' => 0, 'rmb' => 0, 'usd' => 0];
        foreach ($this->data as $key => &$val) {
            $val['chain_quotation'] = isset($coin_quotations[strtoupper($val['chain'])]) ? $coin_quotations[strtoupper($val['chain'])] : [];
            $nickname = json_decode($val['nickname'], true);
            $val['nickname'] = isset($nickname[$this->lang]) ? $nickname[$this->lang] : '';
            $introduce = json_decode($val['introduce'], true);
            $val['introduce'] = isset($introduce[$this->lang]) ? $introduce[$this->lang] : '';
            $this->data[$key] = array_merge($val, isset($coin_quotations[strtoupper($val['name'])]) ? $coin_quotations[strtoupper($val['name'])] : $ticker);

            $val['chain_rmb'] = isset($val['chain_quotation']['rmb']) ? $val['chain_quotation']['rmb'] : 0;
            $val['chain_usd'] = isset($val['chain_quotation']['usd']) ? $val['chain_quotation']['usd'] : 0;
            $val['chain_country_rate'] = (float)sprintf("%0.4f", $rate[0] * $val['chain_rmb']);
            $val['country_rate'] = (false == $currency) ? $val['rmb'] : (float)sprintf("%0.4f", $last[0] * $val['last']);
            unset($val['chain_quotation']);
        }

        doEnd :
        return ['code' => $this->code, 'data' => $this->data, 'msg' => $this->msg];
    }

    /**
     * 币种搜索
     * @param string chain
     * @param string keyword
     * @return array
     */
    public function actionSearch()
    {
        $params = Yii::$app->request->post();
        $chain = isset($params['chain']) ? $params['chain'] : '';
        $keyword = isset($params['keyword']) ? $params['keyword'] : '';

        $header = Yii::$app->request->headers;
        $platform_id = $header['FZM-PLATFORM-ID'] ?? null;
        if (false == $platform_id) {
            $this->code = -1;
            $this->msg = '参数错误';
            goto doEnd;
        }

        $page = empty($params['page']) ? 1 : $params['page'];
        $limit = empty($params['limit']) ? 10 : $params['limit'];

        $query = WalletCoin::find()
            ->select('id, icon, name, nickname, platform, chain, address as contract_address, treaty')
            ->where("JSON_CONTAINS(platform_id,'$platform_id')")
            ->orderBy('id');

        if (false != $chain) {
            $query->andWhere(['chain' => $chain]);
        }

        if (false != $keyword) {
            $query->andWhere(['or', ['like', 'address', $keyword], ['like', 'name', $keyword]]);
        }

        $this->data = $query->offset(($page - 1) * $limit)->limit($limit)->asArray()->all();
        if (false != $this->data) {
//            $chains = array_unique(array_column($this->data, 'chain'));
//            $chain_quotation = [];
//            foreach ($chains as $key => $value) {
//                $chain_quotation[$value] = ExchangeBusiness::getquatation($value);
//            }
//            foreach ($this->data as $key => $value) {
//                $this->data[$key]['chain_quotation'] = $chain_quotation[$value['chain']] ?: null;
//            }
            foreach ($this->data as $key => &$value) {
                $nickname = json_decode($value['nickname'], true);
                $value['nickname'] = isset($nickname[$this->lang]) ? $nickname[$this->lang] : '';
                $value['chain_rmb'] = isset($value['chain_quotation']['rmb']) ? $value['chain_quotation']['rmb'] : 0;
                $value['chain_usd'] = isset($value['chain_quotation']['usd']) ? $value['chain_quotation']['usd'] : 0;
            }
        }

        doEnd :
        return ['code' => $this->code, 'data' => $this->data, 'msg' => $this->msg];
    }

    /**
     * 获取币种简介
     * @param integer id
     * @return array
     */
    public function actionGetCoinById()
    {
        $params = Yii::$app->request->post();
        $id = isset($params['id']) ? $params['id'] : 0;

        $header = Yii::$app->request->headers;
        $platform_id = $header['FZM-PLATFORM-ID'] ?? null;
        if (false == $platform_id || false == $id) {
            $this->code = -1;
            $this->msg = '参数错误';
            goto doEnd;
        }
        $this->data = WalletCoin::find()
            ->where(['id' => $id])
            ->andWhere("JSON_CONTAINS(platform_id,'$platform_id')")
            ->one();
        if (empty($this->data)) {
            goto doEnd;
        }

        $quotation = ExchangeBusiness::getquatation($this->data->name);
        $tikerdata = [
            'publish_count' => $this->data->publish_count,
            'circulate_count' => $this->data->circulate_count
        ];
        if ($quotation) {
            $tikerdata['price'] = $quotation['rmb'];
            $tikerdata['dollar'] = $quotation['usd'];
        } else {
            $tikerdata['price'] = 0;
            $tikerdata['dollar'] = 0;
        }

        $this->data->quotation = $tikerdata;
        $this->data->nickname = isset($this->data->nickname[$this->lang]) ? $this->data->nickname[$this->lang] : '';
        $this->data->introduce = isset($this->data->introduce[$this->lang]) ? $this->data->introduce[$this->lang] : '';

        doEnd :
        return ['code' => $this->code, 'data' => $this->data, 'msg' => $this->msg];
    }
}