<?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\order\source\checkout;

use app\api\service\Order as OrderService;
use app\common\enum\order\OrderSource as OrderSourceEnum;

/**
 * 订单结算台-秒杀商品扩展类
 * Class Sharp
 * @package app\api\service\order\source\checkout
 */
class Sharp extends Basics
{
    /**
     * 验证商品列表
     * @return bool
     */
    public function validateGoodsList(): bool
    {
        // 验证商品是否下架
        if (!$this->validateGoodsStatus()) {
            return false;
        }
        // 验证商品限购
        if (!$this->validateLimitNum()) {
            return false;
        }
        // 判断商品库存
        if (!$this->validateGoodsSeckillStock()) {
            return false;
        }
        return true;
    }

    /**
     * 判断商品是否下架
     * @return bool
     */
    private function validateGoodsStatus(): bool
    {
        foreach ($this->goodsList as $goods) {
            if ($goods['is_delete'] || !$goods['status']) {
                $this->error = "很抱歉,商品 [{$goods['goods_name']}] 已下架";
                return false;
            }
        }
        return true;
    }

    /**
     * 判断商品库存数量
     * @return bool
     */
    private function validateGoodsSeckillStock(): bool
    {
        foreach ($this->goodsList as $goods) {
            if ($goods['total_num'] > $goods['skuInfo']['seckill_stock']) {
                $this->error = "很抱歉,商品 [{$goods['goods_name']}] 库存不足";
                return false;
            }
        }
        return true;
    }

    /**
     * 验证商品限购
     * @return bool
     */
    public function validateLimitNum(): bool
    {
        foreach ($this->goodsList as $goods) {
            // 不限购
            if ($goods['limit_num'] <= 0) return true;
            // 获取用户已下单的件数(未取消 订单来源)
            $alreadyBuyNum = OrderService::getGoodsBuyNum($this->user['user_id'], $goods['goods_id'], OrderSourceEnum::SHARP);
            // 情况1: 已购买0件, 实际想购买5件
            if ($alreadyBuyNum == 0 && $goods['total_num'] > $goods['limit_num']) {
                $this->error = "很抱歉,该商品限购{$goods['limit_num']}件,请修改购买数量";
                return false;
            }
            // 情况2: 已购买3件, 实际想购买1件
            if ($alreadyBuyNum >= $goods['limit_num']) {
                $this->error = "很抱歉,该商品限购{$goods['limit_num']}件,您当前已下单{$alreadyBuyNum}件,无法购买";
                return false;
            }
            // 情况3: 已购买2件, 实际想购买2件
            if (($alreadyBuyNum + $goods['total_num']) > $goods['limit_num']) {
                $diffNum = ($alreadyBuyNum + $goods['total_num']) - $goods['limit_num'];
                $this->error = "很抱歉,该商品限购{$goods['limit_num']}件,您最多能再购买{$diffNum}件";
                return false;
            }
        }
        return true;
    }
}