package com.xmomen.module.product.controller;

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

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import com.xmomen.framework.mybatis.page.Page;
import com.xmomen.module.product.model.ProductLabel;
import com.xmomen.module.product.model.ProductModel;
import com.xmomen.module.product.model.ProductQuery;
import com.xmomen.module.product.model.ProductQueryFilter;
import com.xmomen.module.product.service.ProductService;

// 声明这是一个Spring MVC的控制器类，用于处理HTTP请求
@Controller
// 该控制器下所有请求映射的基础路径为"/wx"
@RequestMapping(value = "/wx")
public class ProductController {

	// 使用Spring的依赖注入功能，将ProductService的实例自动注入到当前类中
	@Autowired
	ProductService productService;

	/**
	 * 处理客户端发送的GET请求，请求路径为"/wx/product"，用于获取产品列表
	 *
	 * @param limit 每页显示的记录数量
	 * @param offset 分页查询的偏移量
	 * @param categoryId 产品所属的类别ID，可选参数
	 * @param productIds 产品ID数组，可选参数
	 * @param keyword 搜索关键词，可选参数
	 * @param orderField 排序字段，可选参数
	 * @param isAsc 是否升序排序，可选参数，默认值为true
	 * @param labels 产品标签列表，可选参数
	 * @return 包含产品信息的分页对象
	 */
	@RequestMapping(value = "/product", method = RequestMethod.GET)
	// 将返回的对象转换为JSON格式响应给客户端
	@ResponseBody
	public Page<ProductModel> getProducts(@RequestParam(value = "limit") Integer limit,
										  @RequestParam(value = "offset") Integer offset,
										  @RequestParam(value = "categoryId", required = false) Integer categoryId,
										  @RequestParam(value = "productIds", required = false) Integer[] productIds,
										  @RequestParam(value = "keyword", required = false) String keyword,
										  @RequestParam(value = "orderField", required = false) String orderField,
										  @RequestParam(value = "isAsc", required = false, defaultValue = "true") Boolean isAsc,
										  @RequestParam(value = "labels", required = false) List<String> labels) {
		// 创建一个ProductQuery对象，用于封装查询条件
		ProductQuery productQuery = new ProductQuery();
		// 设置搜索关键词到查询对象中
		productQuery.setKeyword(keyword);

		// 如果产品ID数组不为空，则将其转换为List并设置到查询对象中
		if (productIds != null && productIds.length > 0) {
			productQuery.setProductIds(Arrays.asList(productIds));
		}

		// 如果类别ID有效，则将其设置到查询对象中
		if (categoryId != null && categoryId > 0) {
			productQuery.setCategoryId(categoryId);
		}

		// 用于存储转换后的标签实体字段
		List<String> labelEntityFields = new ArrayList<String>();
		// 如果标签列表不为空
		if (!CollectionUtils.isEmpty(labels)) {
			// 遍历标签列表
			for (String labelStr : labels) {
				// 根据标签字符串获取对应的ProductLabel枚举实例
				ProductLabel label = ProductLabel.enumOf(labelStr);
				// 如果枚举实例存在，则将其对应的实体字段添加到labelEntityFields列表中
				if (label != null) {
					labelEntityFields.add(label.getEntityField());
				}
			}
		}

		// 如果labelEntityFields列表不为空，则将其设置到查询对象中，否则设置为null
		if (!labelEntityFields.isEmpty()) {
			productQuery.setFilterLabels(labelEntityFields);
		} else {
			productQuery.setFilterLabels(null);
		}

		// 根据排序字段字符串获取对应的ProductQueryFilter枚举实例
		ProductQueryFilter orderFieldType = ProductQueryFilter.enumOf(orderField);
		// 如果枚举实例存在，则设置排序字段和排序方式到查询对象中
		if (orderFieldType != null) {
			productQuery.setOrderField(orderFieldType.getFieldName());
			productQuery.setIsAsc(isAsc);
		}

		// 调用ProductService的方法，根据查询条件、每页记录数和偏移量获取产品列表
		return productService.getProductList(productQuery, limit, offset);
	}

	/**
	 * 处理客户端发送的GET请求，请求路径为"/wx/product/{id}"，用于获取单个产品的详细信息
	 *
	 * @param productId 产品的ID
	 * @return 包含产品详细信息的ProductModel对象
	 */
	@ResponseBody
	@RequestMapping(value = "/product/{id}", method = RequestMethod.GET)
	public ProductModel detail(@PathVariable(value = "id") Integer productId) {
		// 调用ProductService的方法，根据产品ID获取产品的详细信息
		return productService.getDetailById(productId);
	}
}