package org.dromara.member.service;

import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.member.domain.bo.AppFileBo;
import org.dromara.member.domain.vo.AppFileVo;
import org.springframework.web.multipart.MultipartFile;

import java.util.Collection;
import java.util.List;

/**
 * App端文件信息Service接口
 *
 * @author pengles
 */
public interface AppFileService {

    /**
     * 查询App端文件信息
     */
    AppFileVo queryById(Long fileId);

    /**
     * 查询App端文件信息列表
     */
    TableDataInfo<AppFileVo> queryPageList(AppFileBo bo, PageQuery pageQuery);

    /**
     * 查询App端文件信息列表
     */
    List<AppFileVo> queryList(AppFileBo bo);

    /**
     * 新增App端文件信息
     */
    Boolean insertByBo(AppFileBo bo);

    /**
     * 修改App端文件信息
     */
    Boolean updateByBo(AppFileBo bo);

    /**
     * 校验并批量删除App端文件信息
     */
    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);

    /**
     * 上传文件
     *
     * @param file         上传的文件
     * @param userId       用户ID
     * @param fileCategory 文件分类
     * @return 文件信息
     */
    AppFileVo uploadFile(MultipartFile file, Long userId, Integer fileCategory);

    /**
     * 上传头像
     *
     * @param file   头像文件
     * @param userId 用户ID
     * @return 文件信息
     */
    AppFileVo uploadAvatar(MultipartFile file, Long userId);

    /**
     * 批量上传文件
     *
     * @param files        文件数组
     * @param userId       用户ID
     * @param fileCategory 文件分类
     * @return 文件信息列表
     */
    List<AppFileVo> batchUploadFiles(MultipartFile[] files, Long userId, Integer fileCategory);

    /**
     * 根据用户ID查询文件列表
     *
     * @param userId       用户ID
     * @param fileCategory 文件分类（可选）
     * @return 文件列表
     */
    List<AppFileVo> queryByUserId(Long userId, Integer fileCategory);

    /**
     * 根据文件分类查询文件列表
     *
     * @param fileCategory 文件分类
     * @return 文件列表
     */
    List<AppFileVo> queryByCategory(Integer fileCategory);

    /**
     * 下载文件
     *
     * @param fileId 文件ID
     * @param userId 用户ID
     * @return 文件信息
     */
    AppFileVo downloadFile(Long fileId, Long userId);

    /**
     * 删除用户文件
     *
     * @param fileId 文件ID
     * @param userId 用户ID
     * @return 删除结果
     */
    Boolean deleteUserFile(Long fileId, Long userId);

    /**
     * 批量删除用户文件
     *
     * @param fileIds 文件ID列表
     * @param userId  用户ID
     * @return 删除结果
     */
    Boolean batchDeleteUserFiles(Collection<Long> fileIds, Long userId);

    /**
     * 更新文件状态
     *
     * @param fileId 文件ID
     * @param status 状态
     * @param userId 用户ID
     * @return 更新结果
     */
    Boolean updateFileStatus(Long fileId, String status, Long userId);

    /**
     * 获取用户文件统计信息
     *
     * @param userId 用户ID
     * @return 统计信息
     */
    AppFileVo getUserFileStatistics(Long userId);

    /**
     * 清理过期文件
     *
     * @param days 过期天数
     * @return 清理数量
     */
    Integer cleanExpiredFiles(Integer days);

    /**
     * 检查文件是否存在
     *
     * @param fileMd5 文件MD5
     * @param userId  用户ID
     * @return 文件信息
     */
    AppFileVo checkFileExists(String fileMd5, Long userId);

    /**
     * 更新文件公开状态
     *
     * @param fileId   文件ID
     * @param isPublic 是否公开
     * @param userId   用户ID
     * @return 更新结果
     */
    Boolean updateFilePublicStatus(Long fileId, String isPublic, Long userId);

}