<?php

namespace App\Http\Service;


use App\Http\Dao\GameDao;
use App\Http\Dao\OrderDao;
use Exception;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;

class OrderService
{
    /**
     * 修改支付状态
     *
     * @param array $params
     * @return array
     */
    public function changeStatus(array $params): array
    {
        try {
            $orderDao = new OrderDao();
            $gameDao = new GameDao();

            DB::beginTransaction();

            $orderObj = $orderDao->getRecordByOrderId((int)$params['orderID']);

            if (!$orderObj) {
                Log::info(__CLASS__ . '/' . __FUNCTION__ . ':order_id = ' . $params['orderID']);
                throw new \RuntimeException('订单不存在!');
            }

            if ((int)$orderObj->state !== 1) {
                Log::info(__CLASS__ . '/' . __FUNCTION__ . ':order_id = ' . $params['orderID']);
                throw new \RuntimeException('订单状态不是未支付!');
            }

            $gameObj = $gameDao->getRecordById((int)$orderObj->app_id);
            if (!$gameObj) {
                Log::info(__CLASS__ . '/' . __FUNCTION__ . ':app_id = ' . $orderObj->app_id);
                throw new \RuntimeException('订单不存在!');
            }

            //签名验证
            $mdStr = "orderID={$params['orderID']}money={$params['money']}roleID={$params['roleID']}serverID={$params['serverID']}" .
                "extension={$params['extension']}$gameObj->appkey";
            if (md5($mdStr) !== $params['sign']) {
                throw new \RuntimeException('签名验证失败!');
            }

            //将支付状态从"1-未支付"改为"2-支付中"。
            $affectRows = $orderDao->updateById((int)$orderObj->id,['state' => 2, 'updated_at' => date('Y-m-d H:i:s')]);

            if (!$affectRows) {
                Log::info(__CLASS__ . '/' . __FUNCTION__ . ':order_id = ' . $orderObj->order_id);
                throw new \RuntimeException('更新订单状态失败!');
            }

            DB::commit();
        } catch (Exception $e) {
            DB::rollBack();
            throw new \RuntimeException($e->getMessage());
        }

        return [
            'channelID'   => $orderObj->channel_id,
            'state'       => 2,
            'money'       => $params['money'],
            'productName' => $params['productName'],
            'roleID'      => $orderObj->role_id,
            'appID'       => $orderObj->app_id,
        ];
    }


}