package shop.alien.store.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.annotations.*;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import shop.alien.entity.result.R;
import shop.alien.entity.store.vo.PerformanceDetailVo;
import shop.alien.entity.store.vo.PerformanceGroupListVo;
import shop.alien.entity.store.vo.PerformanceListVo;
import shop.alien.store.service.PerformanceListService;
import shop.alien.store.util.CommonConstant;

/**
 * 演出列表Controller（用户端）
 * 提供用户端演出列表查询接口
 *
 * @author system
 * @since 2025-01-XX
 */
@Slf4j
@Api(tags = {"用户端-演出"})
@CrossOrigin
@RestController
@RequestMapping("/performance/list")
@RequiredArgsConstructor
public class PerformanceListController {

    private final PerformanceListService performanceListService;

    /**
     * 查询演出列表（用户端）
     * <p>
     * 根据店铺ID查询演出列表，支持分页
     * 只返回当前店铺下已上线、未删除的演出（无审核/过期等额外筛选）
     * 返回结果包含演出名称、演出者信息、日期范围、演出时间安排等
     * </p>
     *
     * @param page    分页页数，默认1，必须大于0
     * @param size    分页条数，默认10，必须大于0且不超过100
     * @param storeId 店铺ID，必填，必须大于0
     * @return 演出列表分页结果
     */
    @ApiOperation("查询演出列表（用户端）")
    @ApiOperationSupport(order = 1)
    @ApiImplicitParams({
            @ApiImplicitParam(name = "page", value = "分页页数", dataType = "Integer", paramType = "query", required = false),
            @ApiImplicitParam(name = "size", value = "分页条数", dataType = "Integer", paramType = "query", required = false),
            @ApiImplicitParam(name = "storeId", value = "店铺ID", dataType = "Integer", paramType = "query", required = true)
    })
    @GetMapping("/query")
    public R<IPage<PerformanceListVo>> queryPerformanceList(
            @RequestParam(value = "page", defaultValue = "1") Integer page,
            @RequestParam(value = "size", defaultValue = "10") Integer size,
            @RequestParam(value = "storeId") Integer storeId) {
        log.info("查询演出列表，参数：page={}, size={}, storeId={}", page, size, storeId);

        try {
            // 参数校验
            if (storeId == null || storeId <= 0) {
                log.warn("查询演出列表参数校验失败，店铺ID无效：storeId={}", storeId);
                return R.fail("店铺ID不能为空且必须大于0");
            }
            if (page != null && page < 1) {
                log.warn("查询演出列表参数校验失败，分页页数无效：page={}", page);
                return R.fail("分页页数必须大于0");
            }
            if (size != null && size < 1) {
                log.warn("查询演出列表参数校验失败，分页条数无效：size={}", size);
                return R.fail("分页条数必须大于0");
            }
            if (size != null && size > CommonConstant.MAX_PAGE_SIZE) {
                log.warn("查询演出列表参数校验失败，分页条数超过最大值：size={}", size);
                return R.fail("分页条数不能超过" + CommonConstant.MAX_PAGE_SIZE);
            }

            // 规范化分页参数
            Integer normalizedPage = (page == null || page < 1) ? CommonConstant.DEFAULT_PAGE_NUM : page;
            Integer normalizedSize;
            if (size == null || size < 1) {
                normalizedSize = CommonConstant.DEFAULT_PAGE_SIZE;
            } else if (size > CommonConstant.MAX_PAGE_SIZE) {
                normalizedSize = CommonConstant.MAX_PAGE_SIZE;
            } else {
                normalizedSize = size;
            }

            // 调用服务层查询
            IPage<PerformanceListVo> result = performanceListService.queryPerformanceList(
                    normalizedPage, normalizedSize, storeId);

            log.info("查询演出列表成功，店铺ID={}，共{}条记录，当前页{}条",
                    storeId, result.getTotal(), result.getRecords() != null ? result.getRecords().size() : 0);
            return R.data(result);
        } catch (IllegalArgumentException e) {
            log.warn("查询演出列表参数错误，storeId={}，错误信息：{}", storeId, e.getMessage());
            return R.fail(e.getMessage());
        } catch (Exception e) {
            log.error("查询演出列表异常，storeId={}，异常信息：{}", storeId, e.getMessage(), e);
            return R.fail("查询演出列表失败，请稍后重试");
        }
    }

    /**
     * 查询按日期分组的演出列表（用户端）
     * <p>
     * 根据店铺ID查询演出列表，按日期分组返回
     * 只返回审核通过、已上线、未删除的演出
     * 返回未来30天内有演出的日期及其对应的演出列表
     * 日期标题格式：MM-dd 今天 或 MM-dd 星期几
     * </p>
     *
     * @param storeId 店铺ID，必填，必须大于0
     * @return 按日期分组的演出列表
     */
    @ApiOperation("查询按日期分组的演出列表（用户端）")
    @ApiOperationSupport(order = 2)
    @ApiImplicitParams({
            @ApiImplicitParam(name = "storeId", value = "店铺ID", dataType = "Integer", paramType = "query", required = true)
    })
    @GetMapping("/queryGroupByDate")
    public R<PerformanceGroupListVo> queryPerformanceListGroupByDate(
            @RequestParam(value = "storeId") Integer storeId) {
        log.info("查询按日期分组的演出列表，参数：storeId={}", storeId);

        try {
            // 参数校验
            if (storeId == null || storeId <= 0) {
                log.warn("查询按日期分组的演出列表参数校验失败，店铺ID无效：storeId={}", storeId);
                return R.fail("店铺ID不能为空且必须大于0");
            }

            // 调用服务层查询
            PerformanceGroupListVo result = performanceListService.queryPerformanceListGroupByDate(storeId);

            log.info("查询按日期分组的演出列表成功，店铺ID={}，共{}个日期组，{}条演出记录",
                    storeId, result.getGroupList() != null ? result.getGroupList().size() : 0, result.getTotal());
            return R.data(result);
        } catch (IllegalArgumentException e) {
            log.warn("查询按日期分组的演出列表参数错误，storeId={}，错误信息：{}", storeId, e.getMessage());
            return R.fail(e.getMessage());
        } catch (Exception e) {
            log.error("查询按日期分组的演出列表异常，storeId={}，异常信息：{}", storeId, e.getMessage(), e);
            return R.fail("查询按日期分组的演出列表失败，请稍后重试");
        }
    }

    /**
     * 查询演出详情（用户端）
     * <p>
     * 根据演出ID查询演出详细信息
     * 包含演出基本信息、演出时间、演出风格、演出详情描述和演出嘉宾列表
     * 只返回审核通过、已上线、未删除的演出
     * </p>
     *
     * @param id 演出ID，必填，必须大于0
     * @return 演出详情
     */
    @ApiOperation("查询演出详情（用户端）")
    @ApiOperationSupport(order = 3)
    @ApiImplicitParams({
            @ApiImplicitParam(name = "id", value = "演出ID", dataType = "Integer", paramType = "query", required = true)
    })
    @GetMapping("/detail")
    public R<PerformanceDetailVo> queryPerformanceDetail(
            @RequestParam(value = "id") Integer id) {
        log.info("查询演出详情，参数：id={}", id);

        try {
            // 参数校验
            if (id == null || id <= 0) {
                log.warn("查询演出详情参数校验失败，演出ID无效：id={}", id);
                return R.fail("演出ID不能为空且必须大于0");
            }

            // 调用服务层查询
            PerformanceDetailVo result = performanceListService.queryPerformanceDetail(id);

            if (result == null) {
                log.warn("查询演出详情失败，演出不存在或状态不符合要求：id={}", id);
                return R.fail("演出不存在或已下线");
            }

            log.info("查询演出详情成功，id={}，嘉宾数量：{}", id,
                    result.getGuestList() != null ? result.getGuestList().size() : 0);
            return R.data(result);
        } catch (IllegalArgumentException e) {
            log.warn("查询演出详情参数错误，id={}，错误信息：{}", id, e.getMessage());
            return R.fail(e.getMessage());
        } catch (Exception e) {
            log.error("查询演出详情异常，id={}，异常信息：{}", id, e.getMessage(), e);
            return R.fail("查询演出详情失败，请稍后重试");
        }
    }
}

