package shop.alien.store.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import shop.alien.entity.store.FitnessEquipmentInfo;
import shop.alien.entity.store.SportsEquipmentFacility;
import shop.alien.entity.store.vo.FitnessEquipmentCategoryDetailVo;
import shop.alien.entity.store.vo.SportsEquipmentFacilityCategorySummaryVo;
import shop.alien.entity.store.vo.SportsEquipmentFacilityCategoryVo;
import shop.alien.entity.store.vo.SportsEquipmentFacilityVo;

import java.util.List;

/**
 * 运动器材设施服务接口
 *
 * @author system
 * @since 2025-01-XX
 */
public interface SportsEquipmentFacilityService extends IService<SportsEquipmentFacility> {

    /**
     * 分页查询运动器材设施列表
     *
     * @param pageNum          页码
     * @param pageSize         页大小
     * @param storeId           门店ID
     * @param facilityCategory 设施分类
     * @return IPage<SportsEquipmentFacilityVo>
     */
    IPage<SportsEquipmentFacilityVo> getPageList(Integer pageNum, Integer pageSize, Integer storeId, Integer facilityCategory);

    /**
     * 查询运动器材设施列表
     *
     * @param storeId           门店ID
     * @param facilityCategory 设施分类
     * @return List<SportsEquipmentFacilityVo>
     */
    List<SportsEquipmentFacilityVo> getList(Integer storeId, Integer facilityCategory);

    /**
     * 根据区域ID查询设备列表
     *
     * @param storeId 门店ID
     * @param areaId  区域ID
     * @return List<FitnessEquipmentInfo> 设备信息列表
     */
    List<FitnessEquipmentInfo> getListByAreaId(Integer storeId, Integer areaId);

    /**
     * 根据ID查询详情
     *
     * @param id 主键ID
     * @return SportsEquipmentFacilityVo
     */
    SportsEquipmentFacilityVo getDetail(Integer id);

    /**
     * 新增运动器材设施
     *
     * @param facility 设施信息
     * @param imageList 图片列表
     * @param vo 视图对象（包含设备信息：equipmentName、equipmentNums、equipmentImage等）
     * @return boolean
     */
    boolean saveFacility(SportsEquipmentFacility facility, List<String> imageList, SportsEquipmentFacilityVo vo);

    /**
     * 修改运动器材设施
     *
     * @param facility 设施信息
     * @param imageList 图片列表
     * @param vo 视图对象（包含设备信息：equipmentName、equipmentNums、equipmentImage等）
     * @return boolean
     */
    boolean updateFacility(SportsEquipmentFacility facility, List<String> imageList, SportsEquipmentFacilityVo vo);

    /**
     * 删除运动器材设施
     * 根据fitness_equipment_info表的ID删除，会找到所有包含该设备ID的设施记录并处理
     *
     * @param equipmentId 设备ID（fitness_equipment_info表的主键ID）
     * @return boolean
     */
    boolean deleteFacility(Integer equipmentId);

    /**
     * 查询指定店铺按分类汇总的设备信息（用户端）
     * 包含每个分类的设备数量、图片列表和设备列表
     * 通过fitnessEquipmentIds关联FitnessEquipmentInfo信息
     *
     * @param storeId 门店ID
     * @return List<SportsEquipmentFacilityCategorySummaryVo>
     */
    List<SportsEquipmentFacilityCategorySummaryVo> getCategorySummary(Integer storeId);

    SportsEquipmentFacilityVo getStoreDetail(Integer id);

    List<SportsEquipmentFacilityCategoryVo> getstoreCategorySummary(Integer storeId);

    /**
     * 保存分类下的图片
     * 设施列表通过添加接口已保存，此接口仅保存该分类的实景图片
     *
     * @param storeId          门店ID
     * @param facilityCategory 设施分类(1:有氧区, 2:力量区, 3:单功能机械区)
     * @param imageList        图片列表
     * @return boolean
     */
    boolean saveCategoryImages(Integer storeId, Integer facilityCategory, List<String> imageList);

    /**
     * 查询分类的设备详情（用户端）
     * 包含图片列表、各子分类的设备数量汇总、设备列表
     * 按facility_category_name查询，支持商户自定义分类名称
     * 如果facilityCategoryName为空，返回所有分类的数据
     * 如果equipmentType为空，返回该分类下所有类型的数据
     *
     * @param storeId            门店ID，不能为空且必须大于0
     * @param facilityCategoryName 设施分类名称（商户自定义），可选，为空时返回所有分类
     * @param equipmentType       设备类型(1:心肺训练, 2:核心训练, 3:臀腿训练, 4:上肢训练, 5:全身训练, 6:其他)，可选，为空时返回所有类型
     * @return 分类详情列表，不会返回null
     */
    List<FitnessEquipmentCategoryDetailVo> getCategoryDetail(Integer storeId, String facilityCategoryName, Integer equipmentType);
}

