<?php
// +----------------------------------------------------------------------
// | 萤火商城系统 [ 致力于通过产品和服务,帮助商家高效化开拓市场 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2017~2023 https://www.yiovo.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed 这不是一个自由软件,不允许对程序代码以任何形式任何目的的再发行
// +----------------------------------------------------------------------
// | Author: 萤火科技 <admin@yiovo.com>
// +----------------------------------------------------------------------
declare (strict_types=1);

namespace app\api\service\groupon\order;

use app\api\model\Order as OrderModel;
use app\api\model\groupon\Task as TaskModel;
use app\api\model\groupon\Goods as GoodsModel;
use app\common\service\BaseService;
use cores\exception\BaseException;

/**
 * 拼团订单支付成功后的回调
 * Class PaySuccess
 * @package app\api\service\groupon\order
 */
class PaySuccess extends BaseService
{
    /**
     * 回调方法
     * @param $order
     * @throws BaseException
     */
    public function onPaySuccess($order)
    {
        // 获取拼团商品信息
        $goodsInfo = $this->getGrouponGoodsInfo($order);
        // 更新拼单记录
        $this->updateTaskInfo($order, $goodsInfo);
        // 累计拼团商品销量 (实际)
        GoodsModel::setIncSales($goodsInfo['groupon_goods_id']);
    }

    /**
     * 更新拼单记录
     * @param $order
     * @param $goodsInfo
     * @return void
     * @throws BaseException
     */
    private function updateTaskInfo($order, $goodsInfo): void
    {
        $taskId = $order['order_source_id'];
        $model = new TaskModel;
        // 如果订单记录中存在来源ID,视为参与拼单
        if ($taskId > 0) {
            $model->updateTaskInfo($taskId, $order['user_id'], $order['order_id']);
            return;
        }
        // 拼团人数 (仅阶梯团传入)
        $stepPeople = $order['order_source_data']['stepPeople'] ?? 0;
        // 创建新拼单
        $taskId = $model->createTask($order['user_id'], $order['order_id'], $goodsInfo, $stepPeople);
        // 将拼单ID记录到订单来源记录ID
        $this->updateOrderSourceId($order, $taskId);
    }

    /**
     * 更新订单来源记录ID
     * @param $order
     * @param int $taskId
     */
    private function updateOrderSourceId($order, int $taskId)
    {
        OrderModel::updateOrderSourceId($order['order_id'], $taskId);
    }

    /**
     * 获取拼团商品信息
     * @param $order
     * @return GoodsModel|array|null
     */
    private function getGrouponGoodsInfo($order)
    {
        $grouponGoodsId = $order['goods'][0]['goods_source_id'];
        return GoodsModel::detail($grouponGoodsId);
    }
}