<?php
namespace app\service;
use app\model\Order;
use app\model\Sign;
use app\service\util\BlueBrothersClientUtil;
use BlueBrothers\Openapi\Util;
use think\facade\Log;

class RechargeService
{
    private $merchantId;
    private $secretKey;
    public function __construct()
    {
        $this->merchantId = env('blue_brother.merchant_id', 23329);
        $this->secretKey = env('blue_brother.merchant_key', '8db16e8cc8363ed4eb4c14f9520bcc32');

    }
    /**
     * 直连天下提交充值处理
     * @param string $orderNumber
     * @return true
     * @throws \BlueBrothers\Openapi\OpenapiException
     * @throws \app\exception\BusinessException
     */
    public static function rechargeOrder(string $orderNumber)
    {
        $order = Order::getByOrderNumber($orderNumber);
        if ($order['pay_status'] == Order::PAY_STATUS_PAID && $order['order_status'] == Order::STATUS_WAIT_RECHARGE) { // 直连天下充值
            $rechargeOrder = [
                'outTradeNo' => $order["order_number"],// 合作商系统内部订单号,同一商户下不可重复, 同微信、支付宝的out_trade_no类似
                'productId' => $order["product_id"],// 商品编码
                'number' => 1,
                'notifyUrl' => config('cmb.recharge_notify_url'),// 异步通知地址
                'rechargeAccount' => $order["account"],// 手机号,非必传
                'accountType' => 1,// 充值账号类型,1:手机号,2:QQ号,0:其他
            ];
            $res = BlueBrothersClientUtil::getClient()->RechargeOrder($rechargeOrder);
            if ($res['code'] == 2000) {
                $order->order_status = Order::STATUS_RECHARGE_ING;
                $order->save();
            }
        }
        return true;
    }

    /**
     * 充值回调
     * @param $params
     * @return string
     * @throws \BlueBrothers\Openapi\OpenapiException
     * @throws \app\exception\BusinessException
     */
    public  function rechargeNotify($params)
    {
        Log::info('充值回调:' . json_encode($params));
        $sign = Util::getSign($this->secretKey, $params);
        if ($params['sign'] != $sign) {
            return '';
        }
        $orderNumber = $params['outTradeNo'];
        $status = $params['status'];
        $order = Order::getByOrderNumber($orderNumber);
        if ($order->order_status == Order::STATUS_RECHARGE_SUCCESS) {
            return 'success';
        }
        switch ($status) {
            case '01':
                $orderStatus = Order::STATUS_RECHARGE_SUCCESS;
                break;
            case '03':
                $orderStatus = Order::STATUS_RECHARGE_FAIL;
                break;
            default:
                $orderStatus = Order::STATUS_RECHARGE_ING;
                break;
        }
        if ($status == '01' && $order->order_status == Order::STATUS_RECHARGE_ING) { // 充值成功更新协议扣款时间
            $sign = Sign::getByAgreementId($order->agreement_id);
            $sign->agree_recharge_time = strtotime(date('Y-m-d'));
            $sign->save();
        }
        $order->order_status = $orderStatus;
        $order->save();
        if ($status == '03' && $order->refund_status == 0) { // 充值失败,退款
            CmbService::refund($orderNumber);
        }
        if ($status == '04') { // 执行手动拉取
            $this->queryRechargeOrder($orderNumber);
        }
        return 'success';
    }

    /**
     * 主动拉取充值订单状态
     * @param string $orderNumber
     * @return string|true
     * @throws \BlueBrothers\Openapi\OpenapiException
     * @throws \app\exception\BusinessException
     */
    public function queryRechargeOrder(string $orderNumber)
    {
        $res = BlueBrothersClientUtil::getClient()->RechargeQuery($orderNumber);
        if ($res['code'] !== '0000') {
            return '查询失败';
        }
        $status = $res['status'];
        switch ($status) {
            case '01':
                $orderStatus = Order::STATUS_RECHARGE_SUCCESS;
                break;
            case '03':
                $orderStatus = Order::STATUS_RECHARGE_FAIL;
                break;
            default:
                $orderStatus = Order::STATUS_RECHARGE_ING;
                break;
        }
        $order = Order::getByOrderNumber($orderNumber);
        if ($order->order_status == Order::STATUS_RECHARGE_SUCCESS) {
            return true;
        }
        if ($status == '01' && $order->order_status == Order::STATUS_RECHARGE_ING) { // 充值成功更新协议扣款时间
            $sign = Sign::getByAgreementId($order->agreement_id);
            $sign->agree_recharge_time = strtotime(date('Y-m-d'));
            $sign->save();
        }
        $order->order_status = $orderStatus;
        $order->save();
        if ($status == '03' && $order->refund_status == 0) {
            CmbService::refund($orderNumber);
        }
        return true;
    }

}