/*
 * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved.
 *
 * https://www.mall4j.com/
 *
 * 未经允许，不可做商业用途！
 *
 * 版权所有，侵权必究！
 */

// 该类所属的包名，表明其位于商城API相关的监听器包下，主要用于监听与购物车相关的事件，并执行相应的业务逻辑。
package com.yami.shop.api.listener;

import com.google.common.collect.Lists;
import com.yami.shop.bean.app.dto.ShopCartDto;
import com.yami.shop.bean.app.dto.ShopCartItemDiscountDto;
import com.yami.shop.bean.app.dto.ShopCartItemDto;
import com.yami.shop.bean.event.ShopCartEvent;
import com.yami.shop.bean.order.ShopCartEventOrder;
import org.springframework.context.event.EventListener;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * ShopCartListener类主要用于处理购物车相关事件的监听与操作，在默认的购物车链进行组装时执行特定的业务逻辑。
 * 具体来说，它会接收购物车相关事件（ShopCartEvent），并将店铺下的所有商品按照一定规则归属到该店铺的购物车当中，完成购物车数据的组装工作。
 *
 * @author LGH
 */
@Component("defaultShopCartListener")
// 使用@Component注解将该类标记为Spring组件，使得Spring容器能够识别并管理它。同时，为该组件指定了一个名称"defaultShopCartListener"，
// 在其他地方可以通过这个名称来获取该组件的实例（例如在基于名称进行依赖注入时）。
public class ShopCartListener {

    /**
     * defaultShopCartEvent方法是一个事件处理方法，用于监听ShopCartEvent类型的事件，并在事件触发时执行相应的购物车数据组装逻辑。
     * 它会获取事件中携带的购物车信息以及购物车商品列表信息，然后进行一系列的操作，将商品信息按照一定的格式组装到购物车相关的数据结构中，以便后续的业务处理。
     *
     * @param event 传入的ShopCartEvent类型的事件对象，该对象包含了与购物车相关的重要信息，例如购物车本身的信息（通过event.getShopCart()获取）以及购物车中商品的列表信息（通过event.getShopCartItemDtoList()获取）。
     *              具体来说，event.getShopCart()方法可以获取到ShopCartDto类型的购物车对象，它可能包含购物车的标识、所属用户等基本信息；
     *              event.getShopCartItemDtoList()方法可以获取到一个包含ShopCartItemDto类型对象的列表，每个ShopCartItemDto对象代表购物车中的一个商品条目，包含商品的详细信息如商品ID、数量、价格等。
     */
    @EventListener(ShopCartEvent.class)
    // @EventListener注解用于标记该方法为一个事件监听器方法，表明它会监听指定类型（这里是ShopCartEvent类型）的事件。当对应的事件在Spring应用上下文中被发布时，
    // 该方法就会被自动调用，从而执行相应的业务逻辑来处理这个事件。
    @Order(ShopCartEventOrder.DEFAULT)
    // @Order注解用于指定该事件监听器的执行顺序。在存在多个相同类型事件监听器的情况下，Spring会按照这个顺序来依次调用它们，确保业务逻辑按照预定的顺序执行。
    // 这里的ShopCartEventOrder.DEFAULT表示该监听器的执行顺序遵循默认的设定，具体的顺序数值可能在ShopCartEventOrder类中定义，它决定了在整个购物车相关事件处理流程中的先后顺序。
    public void defaultShopCartEvent(ShopCartEvent event) {
        ShopCartDto shopCart = event.getShopCartDto();
        List<ShopCartItemDto> shopCartItemDtoList = event.getShopCartItemDtoList();

        // 对数据进行组装
        List<ShopCartItemDiscountDto> shopCartItemDiscountDtoList = Lists.newArrayList();
        // 创建一个ShopCartItemDiscountDto对象，用于承载要组装的商品折扣等相关信息（从类名推测，可能涉及商品在购物车中的折扣相关数据处理）。
        // 这里虽然目前只看到简单的设置操作，但可能后续会根据业务需求扩展更多与折扣计算、展示等相关的逻辑。
        ShopCartItemDiscountDto shopCartItemDiscountDto = new ShopCartItemDiscountDto();

        shopCartItemDiscountDto.setShopCartItems(shopCartItemDtoList);
        shopCartItemDiscountDtoList.add(shopCartItemDiscountDto);

        shopCart.setShopCartItemDiscounts(shopCartItemDiscountDtoList);
    }
}