<?php

namespace app\admin\service\setting;

use app\admin\service\AdminBaseService;
use app\home\service\BaseHomeService;
use app\model\ContractListMode;
use app\model\ContractSettingModel;
use app\model\ContractTradeModel;
use think\facade\Cache;

class ContractService extends AdminBaseService
{

    public function index()
    {
        try {
            $list = ContractListMode::order('id', 'desc')->select();
            $rows = [];
            if(!$list->isEmpty()){
                $rows =$list->toArray();
            }

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

    // 新增
    public function add($param)
    {
        try {
            // 交易对名称
            if(empty($param['trade_name']) || !is_string($param['trade_name']) || strlen($param['trade_name']) > 100){
                return $this->toData('1', '交易对名称无效', []);
            }

            // 状态
            if(!isset($param['status']) || !in_array($param['status'], ['0', '1'])){
                return $this->toData('1', '状态无效', []);
            }

            // 是否自发
            if(!isset($param['is_owner']) || !in_array($param['is_owner'], ['0', '1'])){
                return $this->toData('1', '是否自发无效', []);
            }

            // 简介
            $info = '';
            if(isset($param['info']) && is_string($param['info'])){
                $info = $param['info'];
            }

            // 面值
            if(!isset($param['face_value']) || !is_numeric($param['face_value']) || $param['face_value'] != ceil($param['face_value']) || $param['face_value'] <= 0){
                return $this->toData('1', '面值无效', []);
            }


            // 排序
            if(!isset($param['sort']) || !is_numeric($param['sort']) || $param['sort'] != ceil($param['sort']) || $param['sort'] < 0){
                return $this->toData('1', '排序值无效', []);
            }

            // 最小杠杆
            if(empty($param['min_pry']) || !is_numeric($param['min_pry']) || $param['min_pry'] != ceil($param['min_pry']) || $param['min_pry'] <= 0){
                return $this->toData('1', '最小杠杆值无效', []);
            }

            // 最大杠杆
            if(empty($param['max_pry']) || !is_numeric($param['max_pry']) || $param['max_pry'] != ceil($param['max_pry']) || $param['max_pry'] <= 0){
                return $this->toData('1', '最大杠杆值无效', []);
            }

            // 强制平仓比例值
            if(empty($param['compel_num']) || !is_numeric($param['compel_num']) || $param['compel_num'] <= 0){
                return $this->toData('1', '强制平仓比例值无效', []);
            }


            // 小数位数
            if(!isset($param['keep_decimal']) || !is_numeric($param['keep_decimal']) || $param['keep_decimal'] != ceil($param['keep_decimal'])  || $param['keep_decimal'] < 0){
                return $this->toData('1', '小数位数值无效', []);
            }

            // 判断名称是否已被添加
            $count = ContractListMode::where('trade_name', $param['trade_name'])->count();
            if($count > 0){
                return $this->toData('1', '合约交易对名称已存在', []);
            }

            $contract = new ContractListMode;
            $contract->trade_name = $param['trade_name'];
            $contract->status = $param['status'];
            $contract->is_owner = $param['is_owner'];
            $contract->info = $info;
            $contract->logo_link = '';
            $contract->face_value = $param['face_value'];
            $contract->sort = $param['sort'];
            $contract->min_pry = $param['min_pry'];
            $contract->max_pry = $param['max_pry'];
            $contract->compel_num = $param['compel_num'];
            $contract->keep_decimal = $param['keep_decimal'];
            $contract->create_time = date('Y-m-d H:i:s');
            $contract->update_time = date('Y-m-d H:i:s');
            $contract->save();

            $list_key="CONTRACT:LIST:".strtoupper($param['trade_name']);
            $redis = $this->getRedis();
            $redis->del($list_key);
            $redis->hMset($list_key, [
                'name'=>strtoupper($param['trade_name']),
                'code'=>strtoupper($param['trade_name']),
                'sort'=>$param['sort'],
                'face_value'=>$param['face_value'],
                'min_pry'=>$param['min_pry'],
                'max_pry'=>$param['max_pry'],
                'compel_num'=>$param['compel_num'],
                'keep_decimal'=>$param['keep_decimal'],
                'is_owner'=>$param['is_owner'],
                'status'=>$param['status']
            ]);

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

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

            $contract = ContractListMode::where('id', $param['id'])->find();
            $beforeStatus = $contract['status'];
            if(empty($contract)){
                return $this->toData('1', '目标不存在', []);
            }

            // 交易对名称
            if(empty($param['trade_name']) || !is_string($param['trade_name']) || strlen($param['trade_name']) > 100){
                return $this->toData('1', '交易对名称无效', []);
            }

            // 状态
            if(!isset($param['status']) || !in_array($param['status'], ['0', '1'])){
                return $this->toData('1', '状态无效', []);
            }

            // 是否自发
            if(!isset($param['is_owner']) || !in_array($param['is_owner'], ['0', '1'])){
                return $this->toData('1', '是否自发无效', []);
            }

            // 简介
            $info = '';
            if(isset($param['info']) && is_string($param['info'])){
                $info = $param['info'];
            }

            // 面值
            if(!isset($param['face_value']) || !is_numeric($param['face_value']) || $param['face_value'] != ceil($param['face_value']) || $param['face_value'] <= 0){
                return $this->toData('1', '面值无效', []);
            }


            // 排序
            if(!isset($param['sort']) || !is_numeric($param['sort']) || $param['sort'] != ceil($param['sort']) || $param['sort'] < 0){
                return $this->toData('1', '排序值无效', []);
            }

            // 最小杠杆
            if(empty($param['min_pry']) || !is_numeric($param['min_pry']) || $param['min_pry'] != ceil($param['min_pry']) || $param['min_pry'] <= 0){
                return $this->toData('1', '最小杠杆值无效', []);
            }

            // 最大杠杆
            if(empty($param['max_pry']) || !is_numeric($param['max_pry']) || $param['max_pry'] != ceil($param['max_pry']) || $param['max_pry'] <= 0){
                return $this->toData('1', '最大杠杆值无效', []);
            }

            // 强制平仓比例值
            if(empty($param['compel_num']) || !is_numeric($param['compel_num']) || $param['compel_num'] <= 0){
                return $this->toData('1', '强制平仓比例值无效', []);
            }

            // 小数位数
            if(!isset($param['keep_decimal']) || !is_numeric($param['keep_decimal']) || $param['keep_decimal'] != ceil($param['keep_decimal'])  || $param['keep_decimal'] < 0){
                return $this->toData('1', '小数位数值无效', []);
            }

            // 判断名称是否已被添加
            $count = ContractListMode::where('trade_name', $param['trade_name'])->where('id', '<>', $param['id'])->count();
            if($count > 0){
                return $this->toData('1', '合约交易对名称已存在', []);
            }

            // 如果状态设置成关闭 则判断是否有正在交易的合约
            if($beforeStatus == 1 && $param['status'] == 0){
                $num=(new ContractTradeModel())->where([
                    'contract_id'=>strtoupper($contract['trade_name']),
                    'status'=>1
                ])->count();
                if ($num != 0) {
                    return $this->toData('1', '交易对还存在交易,不能关闭', []);
                }
            }

            // 写入数据
            $contract->trade_name = $param['trade_name'];
            $contract->status = $param['status'];
            $contract->is_owner = $param['is_owner'];
            $contract->info = $info;
            $contract->logo_link = '';
            $contract->face_value = $param['face_value'];
            $contract->sort = $param['sort'];
            $contract->min_pry = $param['min_pry'];
            $contract->max_pry = $param['max_pry'];
            $contract->compel_num = $param['compel_num'];
            $contract->keep_decimal = $param['keep_decimal'];
            $contract->create_time = date('Y-m-d H:i:s');
            $contract->update_time = date('Y-m-d H:i:s');
            $contract->save();


            $list_key="CONTRACT:LIST:".strtoupper($param['trade_name']);
            $redis = $this->getRedis();
            $redis->del($list_key);
            $redis->hMset($list_key, [
                'name'=>strtoupper($param['trade_name']),
                'code'=>strtoupper($param['trade_name']),
                'sort'=>$param['sort'],
                'face_value'=>$param['face_value'],
                'min_pry'=>$param['min_pry'],
                'max_pry'=>$param['max_pry'],
                'compel_num'=>$param['compel_num'],
                'keep_decimal'=>$param['keep_decimal'],
                'status'=>$param['status']
            ]);
            return $this->toData('0', 'SUCCESS', []);
        }catch (\Exception $exception){
            return $this->toData('1', '系统繁忙', []);
        }
    }

    // 获取合约交易对
    public function getTradeNameList($param)
    {
        try {
            if(isset($param['is_owner']) && in_array($param['is_owner'], [0,1])){
                $list = ContractListMode::where('status', 1)->order('id', 'desc')
                    ->where('is_owner', $param['is_owner'])
                    ->column('trade_name', 'id');
            } else {
                $list = ContractListMode::where('status', 1)->order('id', 'desc')
                    ->column('trade_name', 'id');
            }

            return $this->toData('0', 'SUCCESS', ['list' => $list]);
        }catch (\Exception $exception){
            return $this->toData('1', '系统繁忙', []);
        }
    }
    public function setting($param)
    {
        try {
            $list = ContractSettingModel::order('time_step', 'asc')->select();
            $rows = [];
            if(!$list->isEmpty()){
                $rows =$list->toArray();
            }
            return $this->toData('0', 'SUCCESS', ['list' => $rows, 'total' => count($rows)]);
        }catch (\Exception $exception){
            return $this->toData('1', '系统繁忙', []);
        }
    }
    public function set_add($param)
    {
        // 状态
        if(!isset($param['time_step'])){
            return $this->toData('1', '时间无效', []);
        }
        // 是否自发
        if(!isset($param['earnings_num'])){
            return $this->toData('1', '收益无效', []);
        }
        $contract = ContractSettingModel::where('time_step', $param['time_step'])->find();
        if(!empty($contract)){
            return $this->toData('1', '时间已存在', []);
        }
        $contract = new ContractSettingModel;
        // 写入数据
        $contract->time_step = $param['time_step'];
        $contract->earnings_num = $param['earnings_num'];
        $contract->create_time = date('Y-m-d H:i:s');
        $contract->update_time = date('Y-m-d H:i:s');
        $contract->save();
        $this->initContractSetting();
        return $this->toData('0', 'SUCCESS', []);
    }
    public function set_edit($param)
    {
        // 状态
        if(!isset($param['time_step'])){
            return $this->toData('1', '时间无效', []);
        }
        // 是否自发
        if(!isset($param['earnings_num'])){
            return $this->toData('1', '收益无效', []);
        }
        // 是否自发
        if(!isset($param['id'])){
            return $this->toData('1', 'ID无效', []);
        }
        $contract = ContractSettingModel::where('id', $param['id'])->find();
        if(empty($contract)){
            return $this->toData('1', '目标不存在', []);
        }

        // 写入数据
        $contract->time_step = $param['time_step'];
        $contract->earnings_num = $param['earnings_num'];
        $contract->create_time = date('Y-m-d H:i:s');
        $contract->update_time = date('Y-m-d H:i:s');
        $contract->save();

        $this->initContractSetting();
        return $this->toData('0', 'SUCCESS', []);
    }
    public function set_del($param)
    {
        if(!isset($param['id'])){
            return $this->toData('1', 'ID无效', []);
        }
        $contract = ContractSettingModel::where('id', $param['id'])->find();
        if(empty($contract)){
            return $this->toData('1', '目标不存在', []);
        }
        $contract->where('id',$param['id'])->delete();
        $this->initContractSetting();
        return $this->toData('0', 'SUCCESS', []);

    }
}