<?php

namespace api\controllers;

use Yii;
use yii\data\Pagination;
use api\base\BaseController;
use common\models\psources\CoinCTocTransfer;

class OrderController extends BaseController
{
    public function actionIndex()
    {
        $code = -1;
        $request = Yii::$app->request;
        if (!$request->isPost) {
            $msg = '请求错误!';
            goto doEnd;
        }
        $post = $request->post();

        $data['is_sell'] = (false == $post['isSell']) ? 0 : 1;
        $data['type'] = $post['type'];
        $data['address'] = $post['address'];
        $data['token_name'] = strtoupper($post['token_name']);
        $data['market_name'] = strtoupper($post['market_name']);
        $data['price'] = $post['price'];
        $data['amount'] = $post['amount'];

        $data['transfer_number'] = date('YmdHis') . self::getrandnums();

        $redis = Yii::$app->redis_app;
        $key = 'C2C_' . $data['is_sell'] . '_' . str_replace('/', '', strtoupper($post['token_name'])) . '_' . str_replace('/', '', strtoupper($post['market_name']));
        if ($redis->hexists($key, $data['address'])) {
            $msg = '尚存在一笔未完成的交易!';
            goto doEnd;
        }
        if (!$redis->exists($key)) {
            $redis->hmset($key, $data['address'], time());
        }
        foreach ($post['txs'] as $key => $val) {
            $model = new CoinCTocTransfer();
            $data['txhex'] = $val['tx'];
            $data['transfer_url'] = $val['url'];
            $data['step'] = $val['step'];
            $data['consensus'] = (false == $val['consensus']) ? 0 : 1;
            $data['consensus_platform'] = $val['consensus_platform'];
            $model->load($data, '');
            $model->save();
        }

        $code = 0;
        $msg = 'success';
        doEnd :
        return ['code' => $code, 'msg' => $msg];
    }

    public function actionOrderList()
    {
        $address = Yii::$app->request->get('address', '');
        $is_sell = Yii::$app->request->get('isSell', -1);
        $type = Yii::$app->request->get('type', '');
        $page = Yii::$app->request->get('page', 1);

        if (empty($address)) {
            $msg = '请求参数错误';
            $code = -1;
            $data = null;
            goto doEnd;
        }

        $query = CoinCTocTransfer::find()
            ->where('address= :address', [':address' => $address])
            ->orderBy('create_time desc')
            ->groupBy('address, is_sell');

        if ($is_sell > -1) {
            $query->andWhere('is_sell= :is_sell', [':is_sell' => $is_sell]);
        }
        if (false != $type) {
            $query->andWhere('type= :type', [':type' => $type]);
        }
        $data = $query->offset(($page - 1) * 20)->limit(20)->asArray()->all();
        $countQuery = clone $query;
        $pages = new Pagination(['totalCount' => $countQuery->count(), 'pageSize' => 20]);
        $data = [
            'list' => $data,
            'page' => [
                'pageCount' => $pages->pageCount,
                'pageSize' => 20,
                'currentPage' => $page,
            ]
        ];
        $code = 1;
        $msg = 'success';
        doEnd :

        return ['code' => $code, 'msg' => $msg, 'data' => $data];
    }

    public function actionOrderStatus()
    {
        $address = Yii::$app->request->get('address', '');
        $token_name = Yii::$app->request->get('token_name', '');
        $market_name = Yii::$app->request->get('market_name', '');
        $is_sell = Yii::$app->request->get('isSell', -1);
        $type = Yii::$app->request->get('type', '');

        if (false == $address || false == $token_name || false == $market_name || false == $type || -1 == $is_sell) {
            $msg = '请求参数错误';
            $code = -1;
            $data = null;
            goto doEnd;
        }

        $latest_model = CoinCTocTransfer::find()->select('transfer_number')
            ->where(['is_sell' => (int)$is_sell])
            ->andWhere(['type' => (int)$type])
            ->andWhere(['address' => $address])
            ->andWhere(['token_name' => $token_name])
            ->andWhere(['market_name' => $market_name])
            ->orderBy('transfer_number desc')
            ->asArray()
            ->one();

        if (false == $latest_model) {
            $msg = '订单不存在';
            $code = -1;
            $step = 0;
            goto doEnd;
        }

        $orders_info = CoinCTocTransfer::find()->where(['transfer_number' => $latest_model['transfer_number']])->orderBy('id desc')->asArray()->all();
        sort($orders_info);
        foreach ($orders_info as $key => $val) {
            //未交易
            if ('0' == $val['send_result'] && '0' == $val['query_result'] && '0' == $val['msg']) {
                $step = $key + 1;
                $code = 0;
                $msg = '第' . ($key + 1) . '笔交易尚未执行';
                goto doEnd;
            }
            //交易报错
            if ('0' == $val['send_result'] && '0' == $val['query_result'] && true == $val['msg']) {
                $step = $key + 1;
                $code = -1;
                $msg = $val['msg'];
                goto doEnd;
            }
            //交易成功
            if (true == $val['send_result'] && '0' == $val['query_result'] && '0' == $val['msg']) {
                $step = $key + 1;
                $code = 0;
                $msg = $val['send_result'];
                goto doEnd;
            }
            //交易成功,查询失败
            if (true == $val['send_result'] && 'success' != $val['query_result']) {
                $step = $key + 1;
                $code = -1;
                $msg = $val['msg'];
                goto doEnd;
            }
            //交易成功,查询成功
            if (true == $val['send_result'] && 'success' == $val['query_result'] && 'success' == $val['msg']) {
                if ((count($orders_info) - 1) == $key) {
                    $step = ((count($orders_info) - 1) == $key) ? 99 : ($key + 2);
                    $code = 0;
                    $msg = $val['send_result'];
                    goto doEnd;
                }
                continue;
            }
        }

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

    public static function getrandnums()
    {
        $arr = array();
        while (count($arr) < 6) {
            $arr[] = rand(0, 9);
            $arr = array_unique($arr);
        }
        return implode("", $arr);
    }
}