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

package com.yami.shop.admin.controller;

import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.yami.shop.bean.model.ProdTag;
import com.yami.shop.common.annotation.SysLog;
import com.yami.shop.common.exception.YamiShopBindException;
import com.yami.shop.common.util.PageParam;
import com.yami.shop.security.admin.util.SecurityUtils;
import com.yami.shop.service.ProdTagService;
import org.springframework.beans.factory.annotation.Autowired;
import com.yami.shop.common.response.ServerResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import jakarta.validation.Valid;
import java.util.Date;
import java.util.List;

/**
 * 商品分组
 * 该类作为商品分组相关功能的控制器，提供了商品分组标签的分页查询、详情查询、新增、修改、删除以及获取标签列表等操作的接口
 * @author hzm
 * @date 2019-04-18 09:08:36
 */
@RestController
@RequestMapping("/prod/prodTag")
public class ProdTagController {

    // 通过Spring的自动注入机制，注入ProdTagService对象，用于调用业务层方法来处理商品分组相关的业务逻辑
    @Autowired
    private ProdTagService prodTagService;

    /**
     * 分页查询商品分组标签信息的方法
     * 根据传入的分页参数以及商品分组标签筛选条件，返回符合条件的商品分组标签分页数据
     * @param page 分页对象，包含分页相关的参数，如页码、每页数量等
     * @param prodTag 商品分组标签对象，用于传递筛选商品分组标签的条件，比如状态、标题等
     * @return 返回一个ServerResponseEntity<IPage<ProdTag>>类型的响应，成功时包含符合条件的商品分组标签分页数据
     */
    @GetMapping("/page")
    public ServerResponseEntity<IPage<ProdTag>> getProdTagPage(PageParam<ProdTag> page, ProdTag prodTag) {
        // 使用MyBatis Plus的LambdaQueryWrapper构建查询条件，根据传入的商品分组标签对象中的非空字段进行筛选
        // 例如根据状态、标题等进行筛选，并按照序号（seq）和创建时间降序排列
        IPage<ProdTag> tagPage = prodTagService.page(
                page, new LambdaQueryWrapper<ProdTag>()
                       .eq(prodTag.getStatus()!= null, ProdTag::getStatus, prodTag.getStatus())
                       .like(prodTag.getTitle()!= null, ProdTag::getTitle, prodTag.getTitle())
                       .orderByDesc(ProdTag::getSeq, ProdTag::getCreateTime));
        return ServerResponseEntity.success(tagPage);

    }

    /**
     * 通过id查询单个商品分组标签信息的方法
     * @param id 要查询的商品分组标签的唯一标识（id）
     * @return 返回一个ServerResponseEntity<ProdTag>类型的响应，成功时包含对应id的商品分组标签详情数据
     */
    @GetMapping("/info/{id}")
    public ServerResponseEntity<ProdTag> getById(@PathVariable("id") Long id) {
        return ServerResponseEntity.success(prodTagService.getById(id));
    }

    /**
     * 新增商品分组标签的方法
     * 接收前端传入的商品分组标签信息，进行必要的属性设置、重复性校验后保存到数据库中，并记录操作日志
     * @param prodTag 商品分组标签对象，包含要新增的商品分组标签的详细信息
     * @return 返回一个ServerResponseEntity<Boolean>类型的响应，成功时表示新增操作是否成功（true为成功，false为失败）
     */
    @SysLog("新增商品分组标签")
    @PostMapping
    @PreAuthorize("@pms.hasPermission('prod:prodTag:save')")
    // 使用 @PreAuthorize 注解进行权限校验，只有拥有'prod:prodTag:save'权限的用户才能访问该接口
    public ServerResponseEntity<Boolean> save(@RequestBody @Valid ProdTag prodTag) {
        // 查看是否已存在相同名称的标签，通过标题进行模糊查询
        List<ProdTag> list = prodTagService.list(new LambdaQueryWrapper<ProdTag>().like(ProdTag::getTitle, prodTag.getTitle()));
        if (CollectionUtil.isNotEmpty(list)) {
            // 如果查询到相同名称的标签列表不为空，则抛出异常，提示标签名称已存在，不能添加相同的标签
            throw new YamiShopBindException("标签名称已存在，不能添加相同的标签");
        }
        // 设置默认属性，将是否为默认标签设置为0（表示非默认）
        prodTag.setIsDefault(0);
        // 设置商品数量初始值为0
        prodTag.setProdCount(0L);
        // 设置创建时间为当前时间
        prodTag.setCreateTime(new Date());
        // 设置更新时间为当前时间
        prodTag.setUpdateTime(new Date());
        // 设置商品分组标签所属店铺的id，从当前登录用户信息中获取
        prodTag.setShopId(SecurityUtils.getSysUser().getShopId());
        // 调用业务层方法先进行相关的商品分组标签清理操作（具体逻辑由业务层的removeProdTag方法决定）
        prodTagService.removeProdTag();
        return ServerResponseEntity.success(prodTagService.save(prodTag));
    }

    /**
     * 修改商品分组标签信息的方法
     * 根据传入的商品分组标签信息更新数据库中对应商品分组标签的数据，并记录操作日志，同时进行相关数据处理
     * @param prodTag 商品分组标签对象，包含要修改的商品分组标签的详细信息
     * @return 返回一个ServerResponseEntity<Boolean>类型的响应，成功时表示修改操作是否成功（true为成功，false为失败）
     */
    @SysLog("修改商品分组标签")
    @PutMapping
    @PreAuthorize("@pms.hasPermission('prod:prodTag:update')")
    // 使用 @PreAuthorize 注解进行权限校验，只有拥有'prod:prodTag:update'权限的用户才能访问该接口
    public ServerResponseEntity<Boolean> updateById(@RequestBody @Valid ProdTag prodTag) {
        // 更新商品分组标签的更新时间为当前时间
        prodTag.setUpdateTime(new Date());
        // 调用业务层方法先进行相关的商品分组标签清理操作（具体逻辑由业务层的removeProdTag方法决定）
        prodTagService.removeProdTag();
        return ServerResponseEntity.success(prodTagService.updateById(prodTag));
    }

    /**
     * 通过id删除商品分组标签的方法
     * 根据传入的商品分组标签id删除数据库中对应的商品分组标签信息，并记录操作日志，同时进行相关业务逻辑判断和数据处理
     * @param id 要删除的商品分组标签的唯一标识（id）
     * @return 返回一个ServerResponseEntity<Boolean>类型的响应，成功时表示删除操作是否成功（true为成功，false为失败）
     */
    @SysLog("删除商品分组标签")
    @DeleteMapping("/{id}")
    @PreAuthorize("@pms.hasPermission('prod:prodTag:delete')")
    // 使用 @PreAuthorize 注解进行权限校验，只有拥有'prod:prodTag:delete'权限的用户才能访问该接口
    public ServerResponseEntity<Boolean> removeById(@PathVariable Long id) {
        // 根据传入的id获取对应的商品分组标签对象
        ProdTag prodTag = prodTagService.getById(id);
        if (prodTag.getIsDefault()!= 0) {
            // 如果该商品分组标签是默认标签（isDefault不为0），则抛出异常，提示默认标签不能删除
            throw new YamiShopBindException("默认标签不能删除");
        }
        // 调用业务层方法先进行相关的商品分组标签清理操作（具体逻辑由业务层的removeProdTag方法决定）
        prodTagService.removeProdTag();
        return ServerResponseEntity.success(prodTagService.removeById(id));
    }

    /**
     * 获取商品分组标签列表的方法
     * 直接调用业务层方法获取商品分组标签列表，并返回给前端
     * @return 返回一个ServerResponseEntity<List<ProdTag>>类型的响应，成功时包含商品分组标签列表数据
     */
    @GetMapping("/listTagList")
    public ServerResponseEntity<List<ProdTag>> listTagList() {
        return ServerResponseEntity.success(prodTagService.listProdTag());

    }
}