<?php

namespace app\api\controller\user;

use app\admin\model\user\UserRecharge as UserRechargeModel;
use app\models\system\SystemGroupData;
use app\models\trade\ZtpayCallback;
use app\models\user\UserMoney;
use app\models\user\UserRecharge;
use app\Request;
use crmeb\basic\BaseModel;
use crmeb\services\GroupDataService;
use crmeb\services\SystemConfigService;
use crmeb\services\UtilService;
use crmeb\services\ZtPayService;
use think\Exception;

/**
 * 充值类
 * Class UserRechargeController
 * @package app\api\controller\user
 */
class UserRechargeController
{

    /**
     * 小程序充值
     *
     * @param Request $request
     * @return mixed
     */
    public function routine(Request $request)
    {
        list($price, $recharId, $type) = UtilService::postMore([['price', 0], ['rechar_id', 0], ['type', 0]], $request, true);
        if (!$price || $price <= 0) return app('json')->fail('参数错误');
        $storeMinRecharge = sys_config('store_user_min_recharge');
        if ($price < $storeMinRecharge) return app('json')->fail('充值金额不能低于' . $storeMinRecharge);
        switch ((int)$type) {
            case 0: //支付充值余额
                $paid_price = 0;
                if ($recharId) {
                    $data = SystemGroupData::getDateValue($recharId);
                    if ($data === false) {
                        return app('json')->fail('您选择的充值方式已下架!');
                    } else {
                        $paid_price = $data['give_money'] ?? 0;
                    }
                }
                $rechargeOrder = UserRecharge::addRecharge($request->uid(), $price, 'routine', $paid_price);
                if (!$rechargeOrder) return app('json')->fail('充值订单生成失败!');
                try {
                    return app('json')->successful(UserRecharge::jsPay($rechargeOrder));
                } catch (\Exception $e) {
                    return app('json')->fail($e->getMessage());
                }
                break;
            case 1: //佣金转入余额
                if (UserRecharge::importNowMoney($request->uid(), $price))
                    return app('json')->successful('转入余额成功');
                else
                    return app('json')->fail(UserRecharge::getErrorInfo());
                break;
            default:
                return app('json')->fail('缺少参数');
                break;
        }
    }

    /**
     * 公众号充值
     *
     * @param Request $request
     * @return mixed
     */
    public function wechat(Request $request)
    {
        list($price, $recharId, $from, $type) = UtilService::postMore([['price', 0], ['rechar_id', 0], ['from', 'weixin'], ['type', 0]], $request, true);
        if (!$price || $price <= 0) return app('json')->fail('参数错误');
        $storeMinRecharge = sys_config('store_user_min_recharge');
        if ($price < $storeMinRecharge) return app('json')->fail('充值金额不能低于' . $storeMinRecharge);
        switch ((int)$type) {
            case 0: //支付充值余额
                $paid_price = 0;
                if ($recharId) {
                    $data = SystemGroupData::getDateValue($recharId);
                    if ($data === false) {
                        return app('json')->fail('您选择的充值方式已下架!');
                    } else {
                        $paid_price = $data['give_money'] ?? 0;
                    }
                }
                $rechargeOrder = UserRecharge::addRecharge($request->uid(), $price, 'weixin', $paid_price);
                if (!$rechargeOrder) return app('json')->fail('充值订单生成失败!');
                try {
                    if ($from == 'weixinh5') {
                        $recharge = UserRecharge::wxH5Pay($rechargeOrder);
                    } else {
                        $recharge = UserRecharge::wxPay($rechargeOrder);
                    }
                } catch (\Exception $e) {
                    return app('json')->fail($e->getMessage());
                }
                return app('json')->successful(['type' => $from, 'data' => $recharge]);
                break;
            case 1: //佣金转入余额
                if (UserRecharge::importNowMoney($request->uid(), $price))
                    return app('json')->successful('转入余额成功');
                else
                    return app('json')->fail(UserRecharge::getErrorInfo());
                break;
            default:
                return app('json')->fail('缺少参数');
                break;
        }
    }

    public function rechargeList(Request $request)
    {
        $where = UtilService::getMore([
            ['status', ''],
            ['page', 1],
            ['limit', 10,],
        ], $request);
        return app('json')->successful('ok', UserRechargeModel::getUserRechargeList($where));
    }

    public function moneyRecharge(Request $request)
    {
        list($num, $money_type, $way) = UtilService::postMore([
            ['num', 0], ['money_type', 0, '', '', [function ($item) {
                $money_type = init_money_type();
                if (!isset($money_type[$item]))
                    return false;
                else
                    return true;
            }], ['请选择正确的币种']], ['way', '']
        ], $request, true);
        if (!$num || $num <= 0) return app('json')->fail('参数错误');

        $user_money = UserMoney::initialUserMoney($request->uid(), $money_type);
        if (!$user_money['address']) return app('json')->fail('请先生成或绑定钱包地址');
        BaseModel::beginTrans();
        try {
            $rechargeOrder = UserRecharge::addRecharge($request->uid(), $num, $money_type);
            if (!$rechargeOrder) {
                BaseModel::rollbackTrans();
                return app('json')->fail('充值订单生成失败!');
            }
            $money_types = sys_data('money_type');
            foreach ($money_types as $v) {
                if ($v['code'] == $money_type) {
                    if (($way == '') || ($way != '' && $v['way'] == $way)) {
                        $res = ZtPayService::instance()->transfer(strtoupper($money_type) . ($v['way'] != 'NO' ? ('_' . $v['way']) : ''), $user_money['address'], $v['__money_address'], $num);
                        if ($res['code'] != 0) {
                            BaseModel::rollbackTrans();
                            return app('json')->fail($res['message']);
                        } else {
                            $rechargeOrder->paid = 2;
                            $rechargeOrder->hash = $res['data']['hash'];
                            $rechargeOrder->save();
                            BaseModel::commitTrans();
                            return app('json')->successful($res['message']);
                        }
                    }
                }
            }
            BaseModel::commitTrans();
            return app('json')->successful('充值订单已生成,请前往充值');
        } catch (Exception $e) {
            BaseModel::rollbackTrans();
            return app('json')->fail($e->getMessage());
        }
    }

    public function uploadProof($id, Request $request)
    {
        list($proof) = UtilService::postMore([
            ['proof', '']
        ], $request, true);
        if (!$proof || $proof == "") return app('json')->fail('参数错误');
        $rechargeOrder = UserRecharge::get($id);
        if (!$rechargeOrder || $rechargeOrder['uid'] != $request->uid()) return app('json')->fail('订单异常');
        if ($rechargeOrder['paid'] != 0) return app('json')->fail('订单状态异常');
        $rechargeOrder->paid = 2;
        $rechargeOrder->proof = $proof;
        $res = $rechargeOrder->save();
        if (!$res) return app('json')->fail('凭证上传失败!');
        return app('json')->successful('凭证上传成功');
    }

    /**
     * 充值额度选择
     * @return mixed
     */
    public function index()
    {
        $rechargeQuota = sys_data('user_recharge_quota') ?? [];
        $data['recharge_quota'] = $rechargeQuota;
        $recharge_attention = sys_config('recharge_attention');
        $recharge_attention = explode("\n", $recharge_attention);
        $data['recharge_attention'] = $recharge_attention;
        return app('json')->successful($data);
    }
}