<?php

namespace app\admin\service\setting;

use app\admin\service\AdminBaseService;
use app\model\FeeSettingModel;
use app\model\StockMarketModel;

class FeeService extends AdminBaseService
{
    // 交易手续费
    public function index()
    {
        try {
            $list = FeeSettingModel::order('id', 'desc')->select();
            $rows = [];
            if (!$list->isEmpty()) {
                $rows = $list->toArray();
            }
            return $this->toData('0', 'SUCCESS', ['list' => $rows, 'total' => count($rows), 'extent' => [
                'market_type_list' => StockMarketModel::STOCK_MARKET_TYPE, 'pay_type' => FeeSettingModel::$payTypeList
            ]]);
        } catch (\Exception $exception) {
            return $this->toData('1', '系统繁忙', []);
        }
    }

    public function add($param)
    {
        try {
            $marketTypeIds = array_keys(StockMarketModel::STOCK_MARKET_TYPE);
            if (empty($param['market_type']) || !in_array($param['market_type'], $marketTypeIds)) {
                return $this->toData('1', '市场类型无效', []);
            }

            if (!is_numeric($param['buy_fee']) || $param['buy_fee'] < 0) {
                return $this->toData('1', '买入手续费无效', []);
            }

//            if(empty($param['purchase_fee']) || !is_numeric($param['purchase_fee']) || $param['purchase_fee'] < 0){
//                return $this->toData('1', '盘前申购手续费无效', []);
//            }

            if (!is_numeric($param['sale_fee']) || $param['sale_fee'] < 0) {
                return $this->toData('1', '卖出手续费无效', []);
            }

            if (in_array($param['market_type'], [3, 4, 5, 6, 7, 9, 12,14])) {
                if (empty($param['purchase_fee']) || !is_numeric($param['purchase_fee']) || $param['purchase_fee'] < 0) {
                    return $this->toData('1', '申购手续费无效', []);
                }
            }


            // 结算方式:0固定费用,1按比例结算
            if (!isset($param['pay_type']) || !in_array($param['pay_type'], array_keys(FeeSettingModel::$payTypeList))) {
                return $this->toData('1', '结算方式无效', []);
            }

            // 买入最小下单金额
            if (empty($param['min_buy_num']) || !is_numeric($param['min_buy_num']) || ceil($param['min_buy_num']) != $param['min_buy_num']) {
                return $this->toData('1', '买入最小下单金额无效', []);
            }

            //卖出最小下单金额
            if (empty($param['min_sale_num']) || !is_numeric($param['min_sale_num']) || ceil($param['min_sale_num']) != $param['min_sale_num']) {
                return $this->toData('1', '卖出最小下单金额无效', []);
            }

            // max_entrust_num
            if (empty($param['max_entrust_num']) || !is_numeric($param['max_entrust_num']) || ceil($param['max_entrust_num']) != $param['max_entrust_num']) {
                return $this->toData('1', '最大挂单数量无效', []);
            }

            //  最大持仓数量
            if (empty($param['max_hold_num']) || !is_numeric($param['max_hold_num']) || ceil($param['max_hold_num']) != $param['max_hold_num']) {
                return $this->toData('1', '最大持仓数量无效', []);
            }

            $count = FeeSettingModel::where('market_type', $param['market_type'])->count();
            if ($count > 0) {
                return $this->toData('1', '市场类型已经存在', []);
            }
            $feeSetting = new FeeSettingModel;
            $feeSetting->market_type = $param['market_type'];
            $feeSetting->buy_fee = $param['buy_fee'];
            $feeSetting->sale_fee = $param['sale_fee'];
            $feeSetting->pay_type = $param['pay_type'];
            $feeSetting->purchase_fee = isset($param['purchase_fee']) ? $param['purchase_fee'] : 0;
            $feeSetting->min_buy_num = $param['min_buy_num'];
            $feeSetting->min_sale_num = $param['min_sale_num'];
            $feeSetting->max_entrust_num = $param['max_entrust_num'];
            $feeSetting->max_hold_num = $param['max_hold_num'];
            $feeSetting->min_withdrawal_num = empty($param['min_withdrawal_num']) ? 0 :$param['min_withdrawal_num'];
            $feeSetting->min_recharge_num = empty($param['min_recharge_num']) ? 0 :$param['min_recharge_num'];

            $feeSetting->save();

            // 设置缓存
            $fee_key = $this->getTradeFeeKey($param['market_type']);
            $redis = $this->getRedis();
            $redis->del($fee_key);
            $redis->hMSet($fee_key, $param);

            return $this->toData('0', 'SUCCESS', []);
        } catch (\Exception $exception) {
            return $this->toData('1', '系统繁忙', [$exception->getMessage(), $exception->getTrace()]);
        }
    }

    public function edit($param)
    {
        try {
            if (empty($param['id']) || !is_numeric($param['id'])) {
                return $this->toData('1', '目标不存在', []);
            }
            $feeSetting = FeeSettingModel::where('id', $param['id'])->find();

            if (empty($feeSetting)) {
                return $this->toData('1', '目标不存在', []);
            }

            $marketTypeIds = array_keys(StockMarketModel::STOCK_MARKET_TYPE);
            if (empty($param['market_type']) || !in_array($param['market_type'], $marketTypeIds)) {
                return $this->toData('1', '市场类型无效', []);
            }

            if (!is_numeric($param['buy_fee']) || $param['buy_fee'] < 0) {
                return $this->toData('1', '买入手续费无效', []);
            }

            if (in_array($param['market_type'], [3, 4, 5, 6, 7, 9, 12, 14])) {
                if (empty($param['purchase_fee']) || !is_numeric($param['purchase_fee']) || $param['purchase_fee'] < 0) {
                    return $this->toData('1', '申购手续费无效', []);
                }
            }

            if (!is_numeric($param['sale_fee']) || $param['sale_fee'] < 0) {
                return $this->toData('1', '卖出手续费无效', []);
            }

//            if(empty($param['purchase_fee']) || !is_numeric($param['purchase_fee']) || $param['purchase_fee'] < 0){
//                return $this->toData('1', '申购手续费无效', []);
//            }

            // 结算方式:0固定费用,1按比例结算
            if (!isset($param['pay_type']) || !in_array($param['pay_type'], array_keys(FeeSettingModel::$payTypeList))) {
                return $this->toData('1', '结算方式无效', []);
            }

            // 买入最小下单金额
            if (empty($param['min_buy_num']) || !is_numeric($param['min_buy_num']) || ceil($param['min_buy_num']) != $param['min_buy_num']) {
                return $this->toData('1', '买入最小下单金额无效', []);
            }

            //卖出最小下单金额
            if (empty($param['min_sale_num']) || !is_numeric($param['min_sale_num']) || ceil($param['min_sale_num']) != $param['min_sale_num']) {
                return $this->toData('1', '卖出最小下单金额无效', []);
            }

            // max_entrust_num
            if (empty($param['max_entrust_num']) || !is_numeric($param['max_entrust_num']) || ceil($param['max_entrust_num']) != $param['max_entrust_num']) {
                return $this->toData('1', '最大挂单数量无效', []);
            }

            //  最大持仓数量
            if (empty($param['max_hold_num']) || !is_numeric($param['max_hold_num']) || ceil($param['max_hold_num']) != $param['max_hold_num']) {
                return $this->toData('1', '最大持仓数量无效', []);
            }

            $count = FeeSettingModel::where('market_type', $param['market_type'])->where('id', '<>', $feeSetting->id)->count();
            if ($count > 0) {
                return $this->toData('1', '市场类型已经存在', []);
            }

            $feeSetting->market_type = $param['market_type'];
            $feeSetting->buy_fee = $param['buy_fee'];
            $feeSetting->sale_fee = $param['sale_fee'];
            $feeSetting->pay_type = $param['pay_type'];
            $feeSetting->min_buy_num = $param['min_buy_num'];
            $feeSetting->purchase_fee = $param['purchase_fee'];
            $feeSetting->min_sale_num = $param['min_sale_num'];
            $feeSetting->max_entrust_num = $param['max_entrust_num'];
            $feeSetting->max_hold_num = $param['max_hold_num'];

            $feeSetting->min_withdrawal_num = empty($param['min_withdrawal_num']) ? 0 :$param['min_withdrawal_num'];
            $feeSetting->min_recharge_num = empty($param['min_recharge_num']) ? 0 :$param['min_recharge_num'];

            $feeSetting->save();

            // 设置缓存
            $fee_key = $this->getTradeFeeKey($param['market_type']);
            $redis = $this->getRedis();
            $redis->del($fee_key);
            $redis->hMSet($fee_key, $param);

            return $this->toData('0', 'SUCCESS', []);
        } catch (\Exception $exception) {
            return $this->toData('1', '系统繁忙', []);
        }
    }
}