<?php

namespace app\admin\service\setting;

use app\admin\service\AdminBaseService;
use app\model\StockBlockListModel;
use app\model\StockBrlListModel;
use app\model\StockEurListModel;
use app\model\StockFurListModel;
use app\model\StockGBXListModel;
use app\model\StockHkdListModel;
use app\model\StockIdnListModel;
use app\model\StockInListModel;
use app\model\StockJpListModel;
use app\model\StockListModel;
use app\model\StockMysListModel;
use app\model\StockSgdListModel;
use app\model\StockThaListModel;


// 大宗交易
class BlockStockService extends AdminBaseService
{

    // 列表
    public function index($param)
    {
        try {
            if (empty($param['page']) || !is_numeric($param['page']) || empty($param['limit']) || !is_numeric($param['limit'])) {
                return $this->toData('1', '分页参数错误');
            }

            $where = [];
            // 未删除
            $where[] = [
                'is_delete', '=', StockBlockListModel::IS_DELETE_NO
            ];
            // 股票号
            if (!empty($param['stock_code']) && is_string($param['stock_code'])) {
                $where[] = [
                    'stock_code', '=', $param['stock_code']
                ];
            }

            // 状态
            if (!empty($param['status']) && in_array($param['status'], [StockBlockListModel::STATUS_ON, StockBlockListModel::STATUS_OFF])) {
                $where[] = [
                    'status', '=', $param['status']
                ];
            }

            $query = StockBlockListModel::where($where);
            $totalQuery = StockBlockListModel::where($where);
            $list = $query->order('id', 'desc')->page($param['page'], $param['limit'])->select();
            $total = $totalQuery->order('id', 'desc')->count();


            return $this->toData('0', 'SUCCESS', ['list' => $list, 'total' => $total, 'extend' => [
//                'tape_list' => StockBlockListModel::$tapeList,
                'stock_type_list' => StockBlockListModel::$typeList,
            ]]);
        } catch (\Exception $exception) {
            return $this->toData('1', '系统繁忙', [$exception->getMessage()]);
        }
    }

    // 新增
    public function add($param)
    {
        try {
            // 股票代码
            if (empty($param['stock_code']) || !is_string($param['stock_code'])) {
                return $this->toData('1', '股票代码 无效');
            }


            // 股票类型
            if (empty($param['type']) || !in_array($param['type'], array_keys(StockBlockListModel::$typeList))) {
                return $this->toData('1', '股票市场 无效');
            }

            // 交易所类型
//            if(empty($param['tape']) || !in_array($param['tape'], array_keys(StockBlockListModel::$tapeList))){
//                return $this->toData('1', '交易所类型 无效');
//            }

            switch ($param['type']) {
                case '3':
                    $stock = StockListModel::where('stock_code', $param['stock_code'])->find();
                    if (empty($stock)) return $this->toData('1', 'stock_code 无效');
                    break;
                case '4':
                    $stock = StockIdnListModel::where('stock_code', $param['stock_code'])->find();
                    if (empty($stock)) return $this->toData('1', 'stock_code 无效');
                    break;
                case '5':
                    $stock = StockMysListModel::where('stock_code', $param['stock_code'])->find();
                    if (empty($stock)) return $this->toData('1', 'stock_code 无效');
                    break;
                case '6':
                    $stock = StockThaListModel::where('stock_code', $param['stock_code'])->find();
                    if (empty($stock)) return $this->toData('1', 'stock_code 无效');
                    break;
                case '7':
                    $stock = StockInListModel::where('stock_code', $param['stock_code'])->find();
                    if (empty($stock)) return $this->toData('1', 'stock_code 无效');
                    break;
                case '9':
                    $stock = StockSgdListModel::where('stock_code', $param['stock_code'])->find();
                    if (empty($stock)) return $this->toData('1', 'stock_code 无效');
                    break;
                case '12':
                    $stock = StockHkdListModel::where('stock_code', $param['stock_code'])->find();
                    if (empty($stock)) return $this->toData('1', 'stock_code 无效');
                    break;
                case '14':
                    $stock = StockGBXListModel::where('stock_code', $param['stock_code'])->find();
                    if (empty($stock)) return $this->toData('1', 'stock_code 无效');
                    break;
                case '15':
                    $stock = StockFurListModel::where('stock_code', $param['stock_code'])->find();
                    if (empty($stock)) return $this->toData('1', 'stock_code 无效');
                    break;
                case '16':
                    $stock = StockEurListModel::where('stock_code', $param['stock_code'])->find();
                    if (empty($stock)) return $this->toData('1', 'stock_code 无效');
                    break;
                case '17':
                    $stock = StockBrlListModel::where('stock_code', $param['stock_code'])->find();
                    if (empty($stock)) return $this->toData('1', 'stock_code 无效');
                    break;
                case '18':
                    $stock = StockJpListModel::where('stock_code', $param['stock_code'])->find();
                    if (empty($stock)) return $this->toData('1', 'stock_code 无效');
                    break;
                default:
                    return $this->toData('1', '股票市场或股票代码 无效');
            }


            // 发布状态
            if (empty($param['status']) || !in_array($param['status'], [StockBlockListModel::STATUS_ON, StockBlockListModel::STATUS_OFF])) {
                return $this->toData('1', '发布状态 无效');
            }

            // 单股价格
            if (empty($param['price']) || !is_numeric($param['price']) || $param['price'] <= 0) {
                return $this->toData('1', '单股价格 无效');
            }

            // 最小申购数量
            if (empty($param['min']) || !is_numeric($param['min']) || $param['min'] <= 0 || ceil($param['min']) != $param['min']) {
                return $this->toData('1', '最小购买股数无效');
            }

            // 开始认购时间
            if (empty($param['start_time']) || !is_string($param['start_time'])) {
                return $this->toData('1', '开始认购时间 无效');
            }

            // 认购结束时间
            if (empty($param['end_time']) || !is_string($param['end_time']) || strtotime($param['end_time']) <= strtotime($param['start_time'])) {
                return $this->toData('1', '认购结束时间 无效');
            }

            // 可出售时间时间
            if (empty($param['today_add']) || !is_numeric($param['today_add'])) {
                return $this->toData('1', 'T+n 无效');
            }

            // 新增数据
            $blockStock = new StockBlockListModel();
            $blockStock->stock_code = $param['stock_code'];
            $blockStock->stock_name = $param['stock_name'];
            $blockStock->type = $param['type'];
            $blockStock->tape = $stock->tape;
            $blockStock->status = $param['status'];
            $blockStock->price = $param['price'];
            $blockStock->min = $param['min'];
            $blockStock->start_time = $param['start_time'];
            $blockStock->end_time = $param['end_time'];
            $blockStock->today_add = $param['today_add'];
            $blockStock->keep_decimal = $stock->keep_decimal;
            $blockStock->info = $param['info'] ?? '';
            $blockStock->forced_closure = $stock->forced_closure;
            $blockStock->up_limit = $stock->up_limit;;
            $blockStock->down_limit = $stock->down_limit;
            $blockStock->buy_pwd = isset($param['buy_pwd']) ? trim($param['buy_pwd']) : '' ;

            $blockStock->create_time = date('Y-m-d H:i:s');
            $blockStock->update_time = date('Y-m-d H:i:s');
            $blockStock->save();

            // 加入缓存
            $list_key = StockBlockListModel::$typeListEn[$param['type']] . ":BLOCK:LIST:" . $param['stock_code'];
            $redis = $this->getRedis();
            $redis->del($list_key);
            $redis->hMset($list_key, [
                'stock_name' => $blockStock->stock_name,
                'stock_code' => $blockStock->stock_code,
                'status' => $blockStock->status,
                'keep_decimal' => $blockStock->keep_decimal,
                'forced_closure' => $blockStock->forced_closure,
                'up_limit' => $blockStock->up_limit,
                'down_limit' => $blockStock->down_limit,
                'info' => $blockStock->info,
                'tape' => $blockStock->tape,
                'price' => $blockStock->price,
                'min' => $blockStock->min,
                'start_time' => $blockStock->start_time,
                'end_time' => $blockStock->end_time,
                'today_add' => $blockStock->today_add,
                'buy_pwd'=>$blockStock->buy_pwd
            ]);

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

    // 编辑
    public function edit($param)
    {
        try {
            if (empty($param['id']) || !is_numeric($param['id'])) {
                return $this->toData('1', '主键 无效');
            }

            $blockStock = StockBlockListModel::where('id', $param['id'])->where('is_delete', StockBlockListModel::IS_DELETE_NO)->find();
            if (empty($blockStock)) {
                return $this->toData('1', '主键 无效');
            }

//            // 已中签或者已上市不支持修改
//            if($blockStock->open_status == PreMysStockModel::OPEN_STATUS_HAD || strtotime($blockStock->get_time)<=time()){
//                return $this->toData('1', '已中签或已上市 不支持修改');
//            }

            // 股票代码
            if (empty($param['stock_code']) || !is_string($param['stock_code'])) {
                return $this->toData('1', '股票代码 无效');
            }

            // 股票名称
            if (empty($param['stock_name']) || !is_string($param['stock_name'])) {
                return $this->toData('1', '股票代码 无效');
            }

            // 股票类型
            if (empty($param['type']) || !in_array($param['type'], array_keys(StockBlockListModel::$typeList))) {
                return $this->toData('1', '股票市场 无效');
            }

            switch ($param['type']) {
                case '3':
                    $stock = StockListModel::where('stock_code', $param['stock_code'])->find();
                    if (empty($stock)) return $this->toData('1', 'stock_code 无效');
                    break;
                case '4':
                    $stock = StockIdnListModel::where('stock_code', $param['stock_code'])->find();
                    if (empty($stock)) return $this->toData('1', 'stock_code 无效');
                    break;
                case '5':
                    $stock = StockMysListModel::where('stock_code', $param['stock_code'])->find();
                    if (empty($stock)) return $this->toData('1', 'stock_code 无效');
                    break;
                case '6':
                    $stock = StockThaListModel::where('stock_code', $param['stock_code'])->find();
                    if (empty($stock)) return $this->toData('1', 'stock_code 无效');
                    break;
                case '7':
                    $stock = StockInListModel::where('stock_code', $param['stock_code'])->find();
                    if (empty($stock)) return $this->toData('1', 'stock_code 无效');
                    break;
                case '9':
                    $stock = StockSgdListModel::where('stock_code', $param['stock_code'])->find();
                    if (empty($stock)) return $this->toData('1', 'stock_code 无效');
                    break;
                case '12':
                    $stock = StockHkdListModel::where('stock_code', $param['stock_code'])->find();
                    if (empty($stock)) return $this->toData('1', 'stock_code 无效');
                    break;
                case '14':
                    $stock = StockGBXListModel::where('stock_code', $param['stock_code'])->find();
                    if (empty($stock)) return $this->toData('1', 'stock_code 无效');
                    break;
                case '15':
                    $stock = StockFurListModel::where('stock_code', $param['stock_code'])->find();
                    if (empty($stock)) return $this->toData('1', 'stock_code 无效');
                    break;
                case '16':
                    $stock = StockEurListModel::where('stock_code', $param['stock_code'])->find();
                    if (empty($stock)) return $this->toData('1', 'stock_code 无效');
                    break;
                case '17':
                    $stock = StockBrlListModel::where('stock_code', $param['stock_code'])->find();
                    if (empty($stock)) return $this->toData('1', 'stock_code 无效');
                    break;
                case '18':
                    $stock = StockJpListModel::where('stock_code', $param['stock_code'])->find();
                    if (empty($stock)) return $this->toData('1', 'stock_code 无效');
                    break;
                default:
                    return $this->toData('1', '股票市场或股票代码 无效');
            }

            // 交易所类型
//            if(empty($param['tape']) || !in_array($param['tape'], array_keys(StockBlockListModel::$tapeList))){
//                return $this->toData('1', '交易所类型 无效');
//            }

            // 发布状态
            if (empty($param['status']) || !in_array($param['status'], [StockBlockListModel::STATUS_ON, StockBlockListModel::STATUS_OFF])) {
                return $this->toData('1', '发布状态 无效');
            }

            // 单股价格
            if (empty($param['price']) || !is_numeric($param['price']) || $param['price'] <= 0) {
                return $this->toData('1', '单股价格 无效');
            }

            // 最小申购数量
            if (empty($param['min']) || !is_numeric($param['min']) || $param['min'] <= 0 || ceil($param['min']) != $param['min']) {
                return $this->toData('1', '最小购买股数无效');
            }

            // 开始认购时间
            if (empty($param['start_time']) || !is_string($param['start_time'])) {
                return $this->toData('1', '开始认购时间 无效');
            }

            // 认购结束时间
            if (empty($param['end_time']) || !is_string($param['end_time']) || strtotime($param['end_time']) <= strtotime($param['start_time'])) {
                return $this->toData('1', '认购结束时间 无效');
            }

            // 可出售时间时间
            if (empty($param['today_add']) || !is_numeric($param['today_add'])) {
                return $this->toData('1', 'T+n 无效');
            }

            // 新增数据
            $blockStock->stock_code = $param['stock_code'];
            $blockStock->stock_name = $param['stock_name'];
            $blockStock->type = $param['type'];
            $blockStock->tape = $stock->tape;
            $blockStock->status = $param['status'];
            $blockStock->price = $param['price'];
            $blockStock->min = $param['min'];
            $blockStock->start_time = $param['start_time'];
            $blockStock->end_time = $param['end_time'];
            $blockStock->today_add = $param['today_add'];
            $blockStock->keep_decimal = $stock->keep_decimal;
            $blockStock->info = $param['info'] ?? '';
            $blockStock->forced_closure = $stock->forced_closure;
            $blockStock->up_limit = $stock->up_limit;;
            $blockStock->down_limit = $stock->down_limit;
            $blockStock->update_time = date('Y-m-d H:i:s');
            $blockStock->buy_pwd = trim($param['buy_pwd']);
            $blockStock->save();

            // 加入缓存
            $list_key = StockBlockListModel::$typeListEn[$param['type']] . ":BLOCK:LIST:" . $param['stock_code'];
            $redis = $this->getRedis();
            $redis->del($list_key);
            $redis->hMset($list_key, [
                'stock_name' => $blockStock->stock_name,
                'stock_code' => $blockStock->stock_code,
                'status' => $blockStock->status,
                'keep_decimal' => $blockStock->keep_decimal,
                'forced_closure' => $blockStock->forced_closure,
                'up_limit' => $blockStock->up_limit,
                'down_limit' => $blockStock->down_limit,
                'info' => $blockStock->info,
                'tape' => $blockStock->tape,
                'price' => $blockStock->price,
                'min' => $blockStock->min,
                'start_time' => $blockStock->start_time,
                'end_time' => $blockStock->end_time,
                'today_add' => $blockStock->today_add,
                'buy_pwd'=>$blockStock->buy_pwd,
            ]);

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

//    //删除
//    public function del($param)
//    {
//        try {
//            if (empty($param['id']) || !is_numeric($param['id'])) {
//                return $this->toData('1', '主键 无效');
//            }
//
//            $preInStock = StockBlockListModel::where('id', $param['id'])->where('is_delete', StockBlockListModel::IS_DELETE_NO)->find();
//            if (empty($preInStock)) {
//                return $this->toData('1', '主键 无效');
//            }
//
//            $orderList = UserMysPreStockOrderModel::where('pre_stock_id', $preInStock->id)->select();
//            if (!$orderList->isEmpty()) {
//                return $this->toData('1', '已有申购订单不可删除');
//            }
//
//            // 删除
//            $list_key = "MYS:STOCK:LIST:" . $preInStock->stock_code;
//            $redis = $this->getRedis();
//            $redis->del($list_key);
//
//            //删除 修改状态
//            $preInStock->is_delete = PreMysStockModel::IS_DELETE_YES;
//            $preInStock->save();
//            return $this->toData('0', 'SUCCESS');
//        } catch (\Exception $exception) {
//            return $this->toData('1', '系统繁忙', [$exception->getMessage()]);
//        }
//    }
}