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

package com.yami.shop.admin.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.yami.shop.common.util.PageParam;
import com.yami.shop.bean.model.ProdTagReference;
import com.yami.shop.common.annotation.SysLog;
import com.yami.shop.service.ProdTagReferenceService;
import lombok.AllArgsConstructor;
import com.yami.shop.common.response.ServerResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import jakarta.validation.Valid;

/**
 * 分组标签引用相关操作的控制器类，用于处理后台对分组标签引用的各种请求，
 * 例如分页查询、根据 ID 查询详情、新增、修改以及删除等操作。
 *
 * @author hzm
 * @date 2019-04-18 16:28:01
 */
@RestController
@AllArgsConstructor
@RequestMapping("/generator/prodTagReference")
public class ProdTagReferenceController {

    // 通过构造函数注入的方式，引入分组标签引用服务层接口，用于调用具体的业务逻辑方法
    private final ProdTagReferenceService prodTagReferenceService;

    /**
     * 分页查询分组标签引用信息的方法
     * 此方法接收分页参数（PageParam）以及分组标签引用的查询条件对象（ProdTagReference），
     * 通过调用服务层的方法，利用 MyBatis Plus 的 LambdaQueryWrapper 构建查询条件（当前代码中未添加具体条件，可按需完善），
     * 查询并返回符合条件的分组标签引用信息分页结果。
     *
     * @param page 分页对象，包含分页相关的参数，如页码、每页数量等
     * @param prodTagReference 分组标签引用对象，可用于设置查询条件，例如根据某些属性筛选数据
     * @return 包含分组标签引用信息的分页数据，封装在 ServerResponseEntity 中，方便统一的响应格式处理
     */
    @GetMapping("/page")
    public ServerResponseEntity<IPage<ProdTagReference>> getProdTagReferencePage(PageParam page, ProdTagReference prodTagReference) {
        return ServerResponseEntity.success(prodTagReferenceService.page(page, new LambdaQueryWrapper<ProdTagReference>()));
    }

    /**
     * 根据给定的 ID 查询单个分组标签引用详细信息的方法
     * 此方法接收一个分组标签引用的 ID，通过调用服务层的方法从数据库中获取对应的详细信息，
     * 并将结果封装在 ServerResponseEntity 中返回给前端，方便统一的响应格式处理。
     *
     * @param referenceId 要查询的分组标签引用记录的 ID
     * @return 包含单个分组标签引用详细信息的 ServerResponseEntity，若查询到则返回对应的数据，否则返回相应的空数据表示
     */
    @GetMapping("/info/{referenceId}")
    public ServerResponseEntity<ProdTagReference> getById(@PathVariable("referenceId") Long referenceId) {
        return ServerResponseEntity.success(prodTagReferenceService.getById(referenceId));
    }

    /**
     * 新增分组标签引用的方法
     * 此方法接收一个包含分组标签引用信息的 ProdTagReference 对象，
     * 通过调用服务层的保存方法将该数据保存到数据库中，同时添加了操作日志记录（通过 @SysLog 注解），
     * 并且只有拥有 'generator:prodTagReference:save' 权限的用户才能执行此操作，
     * 最后将保存结果（成功或失败）封装在 ServerResponseEntity 中返回给前端。
     *
     * @param prodTagReference 包含要新增的分组标签引用信息的对象，其属性应符合数据库对应表的字段要求
     * @return 包含保存操作结果（布尔值表示是否成功）的 ServerResponseEntity，用于告知前端新增操作是否成功
     */
    @SysLog("新增分组标签引用")
    @PostMapping
    @PreAuthorize("@pms.hasPermission('generator:prodTagReference:save')")
    public ServerResponseEntity<Boolean> save(@RequestBody @Valid ProdTagReference prodTagReference) {
        return ServerResponseEntity.success(prodTagReferenceService.save(prodTagReference));
    }

    /**
     * 修改分组标签引用信息的方法
     * 此方法接收一个包含更新后分组标签引用信息的 ProdTagReference 对象，
     * 通过调用服务层的更新方法将数据库中的对应记录进行更新，同时添加了操作日志记录（通过 @SysLog 注解），
     * 并且只有拥有 'generator:prodTagReference:update' 权限的用户才能执行此操作，
     * 最后将更新结果（成功或失败）封装在 ServerResponseEntity 中返回给前端。
     *
     * @param prodTagReference 包含要修改的分组标签引用信息的对象，其属性应符合数据库对应表的字段要求
     * @return 包含更新操作结果（布尔值表示是否成功）的 ServerResponseEntity，用于告知前端修改操作是否成功
     */
    @SysLog("修改分组标签引用")
    @PutMapping
    @PreAuthorize("@pms.hasPermission('generator:prodTagReference:update')")
    public ServerResponseEntity<Boolean> updateById(@RequestBody @Valid ProdTagReference prodTagReference) {
        return ServerResponseEntity.success(prodTagReferenceService.updateById(prodTagReference));
    }

    /**
     * 根据给定的 ID 删除分组标签引用记录的方法
     * 此方法接收一个分组标签引用的 ID，通过调用服务层的删除方法从数据库中删除对应的记录，
     * 同时添加了操作日志记录（通过 @SysLog 注解），并且只有拥有 'generator:prodTagReference:delete' 权限的用户才能执行此操作，
     * 最后将删除结果（成功或失败）封装在 ServerResponseEntity 中返回给前端。
     *
     * @param referenceId 要删除的分组标签引用记录的 ID
     * @return 包含删除操作结果（布尔值表示是否成功）的 ServerResponseEntity，用于告知前端删除操作是否成功
     */
    @SysLog("删除分组标签引用")
    @DeleteMapping("/{referenceId}")
    @PreAuthorize("@pms.hasPermission('generator:prodTagReference:delete')")
    public ServerResponseEntity<Boolean> removeById(@PathVariable Long referenceId) {
        return ServerResponseEntity.success(prodTagReferenceService.removeById(referenceId));
    }
}