package jnpf.cultivate.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.github.pagehelper.PageInfo;
import jnpf.entity.cultivate.TeachingRecord;
import jnpf.model.cultivate.dto.teaching.QueryTeachingRecordDto;
import jnpf.model.cultivate.dto.teaching.RecordQueryDto;
import jnpf.model.cultivate.dto.teaching.TeachingSaveDto;
import jnpf.model.cultivate.event.dto.file.FileEventDTO;
import jnpf.model.cultivate.po.teaching.CultivateFile;
import jnpf.model.cultivate.v2.teaching.model.V2Attachment;
import jnpf.model.cultivate.v2.teaching.vo.StoreTeachingVo;
import jnpf.model.cultivate.v2.teaching.vo.TeachingDetailVo;
import jnpf.model.cultivate.v2.teaching.vo.V2TeachingRecordVo;
import jnpf.model.cultivate.vo.teaching.*;

import java.util.List;
import java.util.Map;
import java.util.Set;

public interface TeachingRecordService extends IService<TeachingRecord> {
    /**
     * 选择学员-下拉列表(当前用户的主岗以及下级成员)
     * @param storeId 门店ID
     * @return PositionUserVo 列表
     */
    List<PositionUserVo> getPostUserList(String storeId);

    /**
     * 我的带教-分页查询
     * @param queryTeachingRecordDto 查询条件封装对象
     * @return TeachingRecordVo 分页结果
     */
    PageInfo<TeachingRecordVo> page(QueryTeachingRecordDto queryTeachingRecordDto);

    /**
     * 新增带教记录
     * @param teachingSaveDto 带教保存数据传输对象
     */
    void add(TeachingSaveDto teachingSaveDto);

    /**
     * 更新带教记录
     * @param teachingSaveDto 带教更新数据传输对象
     */
    void update(TeachingSaveDto teachingSaveDto);

    /**
     * 更新附件信息
     * @param bizId 业务id
     * @param fileList 文件列表
     * @param fileType 文件类型
     */
    void updateFileInfo(String bizId, List<V2Attachment> fileList, FileEventDTO.FileType fileType);

    /**
     * 转换文件list
     * @param recordId 记录id
     * @param fileList 文件列表
     * @param userId 用户id
     * @param fileType 文件类型
     * @return java.util.List<jnpf.model.cultivate.po.teaching.CultivateFile>
     */
    List<CultivateFile> changeToFileList(String recordId, List<V2Attachment> fileList, String userId, FileEventDTO.FileType fileType);

    /**
     * 我的带教-删除指定ID的带教记录
     * @param id 带教记录ID
     */
    void delete(String id);

    /**
     * 上级带教-查询我被带教的记录列表（分页）
     * @param queryTeachingRecordDto 查询条件封装对象
     * @return TeachingRecordVo 分页结果
     */
    PageInfo<TeachingRecordVo> queryMyTeachingRecordList(QueryTeachingRecordDto queryTeachingRecordDto);

    /**
     * 我的带教-查看数据-统计学员信息（分页）
     * @param queryTeachingRecordDto 查询条件封装对象
     * @return PageInfo<TeachingDataListVo> 学员统计数据分页结果
     */
    PageInfo<TeachingDataListVo> teachingStudentDataCount(QueryTeachingRecordDto queryTeachingRecordDto);

    /**
     * 上级带教-查看我的带教数据
     * @param queryTeachingRecordDto 查询条件封装对象
     * @return List<SkillCountVo> 技能统计列表
     */
    List<SkillCountVo> queryMyTeachingData(QueryTeachingRecordDto queryTeachingRecordDto);

    /**
     * 带教员下拉列表
     * @param queryTeachingRecordDto 查询条件封装对象
     * @return List<TeachingUserVo> 带教员列表
     */
    List<TeachingUserVo> teachingSelectList(QueryTeachingRecordDto queryTeachingRecordDto);

    /**
     * 我的带教-带教员下拉列表-上级带教
     * @param queryTeachingRecordDto 查询条件封装对象
     * @return List<TeachingUserVo> 上级带教员列表
     */
    List<TeachingUserVo> teachingSuperiorSelectList(QueryTeachingRecordDto queryTeachingRecordDto);

    /**
     * 获取带教记录详情（用于修改时的数据回显）
     * @param id 带教记录ID
     * @return TeachingRecordDetailVo 带教记录详细信息
     */
    TeachingRecordDetailVo getTeachingDetail(String id);

    /**
     * 获取带教相关的门店下拉列表
     * @return List<TeachingStoreListVo> 门店列表
     */
    List<TeachingStoreListVo> getTeachingStoreList();

    /**
     * 带教-汇总查询（分页）
     * @param queryTeachingRecordDto 查询条件封装对象
     * @return PageInfo<TeachingDataListVo> 汇总数据分页结果
     */
    PageInfo<TeachingDataListVo> teachingSummaryPage(QueryTeachingRecordDto queryTeachingRecordDto);

    /**
     * 带教-汇总查询-导出Excel文件
     * @param queryTeachingRecordDto 查询条件封装对象
     */
    void summaryTeachExport(QueryTeachingRecordDto queryTeachingRecordDto);

    /**
     * 汇总带教详情-学员统计-导出Excel文件
     * @param queryTeachingRecordDto 查询条件封装对象
     */
    void studentDetailExport(QueryTeachingRecordDto queryTeachingRecordDto);

    /**
     * 带教明细分页查询
     * @param queryTeachingRecordDto 查询条件封装对象
     * @return PageInfo<TeachingRecordVo> 明细数据分页结果
     */
    PageInfo<TeachingRecordVo> teachingItemPage(QueryTeachingRecordDto queryTeachingRecordDto);

    /**
     * 带教明细导出Excel文件
     * @param queryTeachingRecordDto 查询条件封装对象
     */
    void detailItemTeachExport(QueryTeachingRecordDto queryTeachingRecordDto);

    /**
     * 带教明细-批量删除多条记录
     * @param ids 要删除的记录ID集合
     */
    void batchDeleteRecord(List<String> ids);

    /**
     * 店长界面带教统计
     * @param storeId 门店ID
     * @return TeachingStoreCountVo 门店带教统计信息
     */
    TeachingStoreCountVo storeTeachingCount(String storeId);

    /**
     * 带教统计
     * @param queryTeachingRecordDto 查询条件封装对象
     * @return TeachingCountVo 统计结果
     */
    TeachingCountVo teachingCount(QueryTeachingRecordDto queryTeachingRecordDto);

    /**
     * 获取上级带教统计信息
     * @param storeId 门店ID
     * @return SuperiorTeachingSummaryVo 上级带教统计信息
     */
    SuperiorTeachingSummaryVo getSuperiorTeachingSummary(String storeId);

    /**
     * 根据storeIds查询每个门店下的带教数量
     * @param queryDto 查询条件
     * @return java.util.List<jnpf.model.cultivate.v2.teaching.vo.StoreTeachingVo>
     */
    List<StoreTeachingVo> getStoreRecordCount(RecordQueryDto queryDto);

    /**
     * 根据storeId查询门店下的带教记录[分页]
     * @param queryDto 查询条件
     * @return com.github.pagehelper.PageInfo<jnpf.model.cultivate.v2.teaching.vo.V2TeachingRecordVo>
     */
    PageInfo<V2TeachingRecordVo> getStoreRecordPage(RecordQueryDto queryDto);

    /**
     * 查询带教详情
     * @param bizId 带教/练习id
     * @return jnpf.model.cultivate.v2.teaching.vo.TeachingDetailVo
     */
    TeachingDetailVo getTeachingDetailById(String bizId);

    /**
     * 附件map
     * @param recordIds 记录ids
     * @return java.util.Map<java.lang.String,java.util.List<jnpf.model.cultivate.po.teaching.CultivateFile>>
     */
    Map<String, List<CultivateFile>> getFileMap(List<String> recordIds);

    /**
     * 获取用户已浏览的记录
     * @param bizIds 业务ids
     * @param userId 用户id
     * @return java.util.Set<java.lang.String>
     */
    Set<String> getViewedSet(List<String> bizIds, String userId);

    /**
     * 移动所有旧文件到文件表中
     */
    void removeAllOldFile();
}