package com.xmomen.module.product.service.impl;

import java.util.ArrayList;
import java.util.List;

import com.xmomen.module.resource.service.ResourceUtilsService;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import com.xmomen.framework.mybatis.dao.MybatisDao;
import com.xmomen.framework.mybatis.page.Page;
import com.xmomen.module.product.mapper.ProductMapper;
import com.xmomen.module.product.model.ProductModel;
import com.xmomen.module.product.model.ProductQuery;
import com.xmomen.module.product.service.ProductService;
import com.xmomen.module.resource.service.ResourceService;

/**
 * ProductServiceImpl 类是 ProductService 接口的实现类，负责处理产品相关的业务逻辑。
 * 它使用 MyBatis 进行数据库操作，对查询到的产品数据进行处理，如隐藏商品原价、处理图片 URL 等。
 */
@Service
public class ProductServiceImpl implements ProductService {

    // 注入 MyBatis 数据访问对象，用于执行数据库操作
    @Autowired
    MybatisDao mybatisDao;

    /**
     * 根据查询条件分页获取产品列表，并对产品信息进行处理。
     * @param productQuery 产品查询条件对象
     * @param limit 每页显示的记录数
     * @param offset 分页偏移量
     * @return 包含产品信息的分页对象
     */
    @SuppressWarnings("unchecked")
    @Override
    public Page<ProductModel> getProductList(ProductQuery productQuery, Integer limit, Integer offset) {
        // 调用 MyBatis 的分页查询方法，获取产品列表的分页对象
        Page<ProductModel> pageModel = (Page<ProductModel>) mybatisDao.selectPage(ProductMapper.ProductMapperNameSpace + "getProductList", productQuery, limit, offset);
        // 获取分页对象中的产品列表
        List<ProductModel> products = pageModel.getResult();
        // 如果产品列表不为空
        if (products != null) {
            // 遍历产品列表
            for (ProductModel product : products) {
                // 隐藏商品原价
                product.setBasePrice(null);
                // 如果产品的图片 URL 为空
                if (StringUtils.isEmpty(product.getPicUrl())) {
                    // 设置为默认图片路径
                    product.setPicUrl(ResourceUtilsService.getDefaultPicPath());
                } else {
                    // 转换为完整的 HTTP 路径
                    product.setPicUrl(ResourceUtilsService.getWholeHttpPath(product.getPicUrl()));
                }
            }
        }
        // 返回处理后的分页对象
        return pageModel;
    }

    /**
     * 根据产品 ID 获取产品详细信息，并处理产品的图片信息。
     * @param id 产品 ID
     * @return 包含产品详细信息的 ProductModel 对象，如果未找到则返回 null
     */
    @Override
    public ProductModel getDetailById(Integer id) {
        // 调用 MyBatis 的查询方法，根据产品 ID 获取产品详细信息列表
        List<ProductModel> products = mybatisDao.getSqlSessionTemplate().selectList(ProductMapper.ProductMapperNameSpace + "getProductDetail", id);
        // 用于存储产品的图片 URL 列表
        List<String> picUrls = new ArrayList<String>();
        // 用于存储默认图片 URL
        String defaultPicUrl = null;
        // 如果产品详细信息列表不为空
        if (products != null && !products.isEmpty()) {
            // 遍历产品详细信息列表
            for (ProductModel product : products) {
                // 如果产品的图片 URL 不为空
                if (!StringUtils.isEmpty(product.getPicUrl())) {
                    // 如果该图片是默认图片
                    if (product.getIsDefaultPath()) {
                        // 记录默认图片 URL
                        defaultPicUrl = product.getPicUrl();
                    }
                    // 将图片 URL 转换为完整的 HTTP 路径并添加到图片 URL 列表中
                    picUrls.add(ResourceUtilsService.getWholeHttpPath(product.getPicUrl()));
                }
            }
            // 获取第一个产品详细信息对象
            ProductModel detail = products.get(0);
            // 如果图片 URL 列表为空
            if(picUrls.isEmpty()) {
                // 添加默认图片路径
                picUrls.add(ResourceUtilsService.getDefaultPicPath());
            }
            // 设置产品的图片 URL 列表
            detail.setPicUrls(picUrls);
            // 隐藏商品原价
            detail.setBasePrice(null);
            // 如果默认图片 URL 为空
            if (defaultPicUrl == null) {
                // 如果产品的图片 URL 为空
                if (StringUtils.isEmpty(detail.getPicUrl())) {
                    // 设置为默认图片路径
                    detail.setPicUrl(ResourceUtilsService.getDefaultPicPath());
                } else {
                    // 转换为完整的 HTTP 路径
                    detail.setPicUrl(ResourceUtilsService.getWholeHttpPath(detail.getPicUrl()));
                }
            } else {
                // 将默认图片 URL 转换为完整的 HTTP 路径并设置给产品
                detail.setPicUrl(ResourceUtilsService.getWholeHttpPath(defaultPicUrl));
            }
            // 返回处理后的产品详细信息对象
            return detail;
        }
        // 未找到产品信息，返回 null
        return null;
    }

    /**
     * 根据产品 ID 列表获取产品列表，并对产品信息进行处理。
     * @param itemIds 产品 ID 列表
     * @return 包含产品信息的列表，如果 ID 列表为空则返回空列表
     */
    @Override
    public List<ProductModel> getProducts(List<Integer> itemIds) {
        // 如果产品 ID 列表为空
        if (CollectionUtils.isEmpty(itemIds)) {
            // 返回一个空的产品列表
            return new ArrayList<ProductModel>();
        }
        // 创建产品查询条件对象
        ProductQuery productQuery = new ProductQuery();
        // 设置查询条件中的产品 ID 列表
        productQuery.setProductIds(itemIds);
        // 调用 MyBatis 的查询方法，根据产品 ID 列表获取产品列表
        List<ProductModel> products = mybatisDao.getSqlSessionTemplate().selectList(ProductMapper.ProductMapperNameSpace + "getProductsByIds", productQuery);
        // 如果产品列表不为空
        if (products != null && !products.isEmpty()) {
            // 遍历产品列表
            for (ProductModel product : products) {
                // 隐藏商品原价
                product.setBasePrice(null);
                // 如果产品的图片 URL 为空
                if (StringUtils.isEmpty(product.getPicUrl())) {
                    // 设置为默认图片路径
                    product.setPicUrl(ResourceUtilsService.getDefaultPicPath());
                } else {
                    // 转换为完整的 HTTP 路径
                    product.setPicUrl(ResourceUtilsService.getWholeHttpPath(product.getPicUrl()));
                }
            }
        }
        // 返回处理后的产品列表
        return products;
    }
}