package shop.alien.store.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import shop.alien.entity.store.StoreStaffConfig;
import shop.alien.entity.store.dto.StoreStaffConfigListQueryDto;
import shop.alien.entity.store.vo.StoreStaffPositionCountVo;

import java.io.IOException;
import java.util.List;

public interface StoreStaffConfigService {

    /**
     * 员工列表查询（商家端）
     *
     * @param query 查询条件DTO
     * @return 员工列表
     */
    IPage<StoreStaffConfig> getStaffConfigList(StoreStaffConfigListQueryDto query);

    /**
     * 新增或更新员工（商家端）
     *
     * @param storeStaffConfig 员工信息
     * @return 新增或更新结果
     */
    int addOrUpdateStaffConfig(StoreStaffConfig storeStaffConfig);

    /**
     * 审核员工
     *
     * @param id 员工ID
     * @param status 审核状态 0-待审核, 1-审核通过, 2-审核拒绝
     * @param rejectionReason 拒绝原因（status=2时必填）
     * @return
     */
    Integer audit(Integer id, Integer status, String rejectionReason);

    /**
     * 员工详情查询（商家端）
     *
     * @param id 员工ID
     * @return 员工详情
     */
    StoreStaffConfig getStaffConfigDeatail(Integer id);

    String staffConfigExport(String status) throws IOException;

    /**
     * 删除员工（商家端）
     *
     * @param id
     * @return
     */
    Integer deleteStaffConfig(Integer id);

    /**
     * 置顶员工（商家端）
     *
     * @param id 员工ID
     * @param topStatus 置顶状态 0-未置顶, 1-置顶
     * @return
     */
    Integer setTopStatus(Integer id, Integer topStatus);

    /**
     * 设置员工上线/下线状态（商家端）
     *
     * @param id 员工ID
     * @param onlineStatus 上线状态 0-上线, 1-下线
     * @return
     */
    Integer setOnlineStatus(Integer id, Integer onlineStatus);


    /**
     * 员工列表查询（用户端）
     * <p>
     * 查询指定店铺的员工列表，支持按状态和职位筛选
     * 排序规则：先按置顶状态降序，再按置顶时间降序，最后按创建时间降序
     * </p>
     *
     * @param page          分页页数，必须大于0
     * @param size          分页条数，必须大于0
     * @param storeId       店铺ID，必须大于0
     * @param status        员工状态，可选（0-待审核 1-审核通过 2-审核拒绝），为空时查询所有状态
     * @param staffPosition 员工职位，可选，为空时查询所有职位
     * @return 员工列表分页结果
     */
    IPage<StoreStaffConfig> queryStaffList(Integer page, Integer size, Integer storeId, String status, String staffPosition);

    /**
     * 员工列表查询（按标题分组）（用户端）
     * <p>
     * 根据店铺ID查询store_staff_title表中的记录，并通过staff_ids关联出store_staff_config
     * 返回按标题分组的员工列表，每个标题下包含对应的员工信息
     * 保留原有逻辑：今日是否有演出、点赞数、好评数等
     * </p>
     *
     * @param storeId 店铺ID，必须大于0
     * @return 按标题分组的员工列表
     */
    List<shop.alien.entity.store.vo.StaffTitleGroupVo> queryStaffListByTitle(Integer storeId);

    /**
     * 根据标题ID查询员工列表（用户端）
     * <p>
     * 根据店铺ID和标题ID查询store_staff_title表中的记录，并通过staff_ids关联出store_staff_config
     * 返回该标题下的员工列表
     * 保留原有逻辑：今日是否有演出、点赞数、好评数等
     * </p>
     *
     * @param storeId 店铺ID，必须大于0
     * @param titleId 标题ID，必须大于0
     * @return 员工列表
     */
    List<StoreStaffConfig> queryStaffListByTitleId(Integer storeId, Integer titleId);

    /**
     * 员工详情查询（用户端）
     *
     * @param id 员工主键id
     * @return 员工详情
     */
    StoreStaffConfig queryStaffDetail(Integer id);

    /**
     * 员工详情查询（包含演出列表）（用户端）
     * <p>
     * 查询员工基本信息以及关联的演出安排列表
     * 演出安排列表包含未来30天内的所有演出时间
     * </p>
     *
     * @param id 员工主键ID，必须大于0
     * @param userId 当前登录用户ID，可为null（未登录时）
     * @return 员工详情（包含演出列表），如果员工不存在则返回null
     */
    shop.alien.entity.store.vo.StoreStaffDetailWithPerformanceVo queryStaffDetailWithPerformance(Integer id, String userId);

    /**
     * 获取美食员工列表
     *
     * @param page          分页页数
     * @param size          分页条数
     * @param storeId       店铺ID
     * @param staffPosition 员工职位
     * @param status        员工状态
     * @return 员工列表
     */
    IPage<StoreStaffConfig> getFoodStaffConfigList(int page, int size, Integer storeId, String staffPosition, String status);

    /**
     * 根据ID查询员工详情（包含员工信息和课程列表）
     * <p>
     * 查询员工基本信息以及关联的运动健身员工课程信息
     * </p>
     *
     * @param id 员工主键ID，必须大于0
     * @return 员工详情（包含员工信息和课程列表），如果员工不存在则返回null
     */
    shop.alien.entity.store.vo.StoreStaffDetailVo getStaffDetailWithCourse(Integer id);

    /**
     * 查询健身教练详情（包含员工信息、基本信息和认证/荣誉列表）
     * <p>
     * 查询员工基本信息、运动健身员工基本信息以及关联的认证和荣誉信息
     * 认证和荣誉根据type字段分开（1-认证，2-荣誉）
     * </p>
     *
     * @param id 员工主键ID，必须大于0
     * @return 健身教练详情（包含员工信息、基本信息和认证/荣誉列表），如果员工不存在则返回null
     */
    shop.alien.entity.store.vo.StoreStaffFitnessDetailVo getFitnessCoachDetail(Integer id);

    /**
     * 查询指定店铺的员工职位统计信息
     * <p>
     * 统计指定店铺下各个职位的员工数量，只统计未删除的员工
     * </p>
     *
     * @param storeId 店铺ID，必须大于0
     * @return 员工职位统计列表，每个元素包含职位名称和对应员工数量
     */
    List<StoreStaffPositionCountVo> getStaffPositionCount(Integer storeId);

    /**
     * 查询指定店铺的员工职位列表
     * <p>
     * 查询指定店铺下所有不重复的职位名称列表，只统计未删除的员工
     * </p>
     *
     * @param storeId 店铺ID，必须大于0
     * @return 员工职位名称列表
     */
    List<String> getStaffPositionList(Integer storeId);
}
