package com.seer.teach.common.service;

import com.seer.teach.common.response.OssImageUploadResp;
import org.springframework.web.multipart.MultipartFile;

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

/**
 * @Author: Captain
 * @Description: 通用Service
 * @Date: 2025-05-09 13:34
 */
public interface CommonFileService {

    /**
     * 上传图片文件到OSS存储
     *
     * @param userId 用户ID
     * @param file   要上传的图片文件
     * @return OssImageUploadResp 上传结果响应对象
     * @throws IOException 文件读写异常
     */
    OssImageUploadResp uploadImage(Integer userId, MultipartFile file) throws IOException;


    /**
     * 上传图片到OSS存储服务
     *
     * @param userId 用户ID，用于标识图片所属用户
     * @param imageBase64 图片的Base64编码字符串
     * @return OssImageUploadResp 包含图片上传结果信息的响应对象
     * @throws IOException 当图片处理或上传过程中发生IO异常时抛出
     */
    OssImageUploadResp uploadEnImage(Integer userId,String imageBase64) throws IOException;

    /**
     * 上传二维码图片到Minio存储
     *
     * @param bytes    二维码图片的字节数组
     * @param fileName 文件名称
     * @throws Exception 上传过程中的异常
     */
    void minioUploadQrCodeImage(byte[] bytes, String fileName) throws Exception;

    /**
     * 批量上传图片文件
     *
     * @param loginIdAsInt 登录用户ID
     * @param files        要上传的图片文件数组
     * @return List<OssImageUploadResp> 上传结果响应对象列表
     */
    List<OssImageUploadResp> multiUploadImg(Integer loginIdAsInt, MultipartFile[] files);

    /**
     * 上传APK文件
     *
     * @param file 要上传的APK文件，类型为MultipartFile
     * @return 返回上传后的文件存储路径或文件标识符
     */
    String uploadAPKFile(MultipartFile file);

    /**
     * 上传广告图片
     *
     * @param file 要上传的图片文件，类型为MultipartFile
     * @return 返回上传成功后的图片访问路径或文件名
     */
    String uploadAdvertisingPicture(MultipartFile file);

    /**
     * 删除指定名称的文件
     *
     * @param fileName 要删除的文件名称
     */
    void deleteFile(String fileName);

    /**
     * 上传AI批改图片
     *
     * @param userId 用户ID
     * @param file   要上传的图片文件
     * @return 图片在OSS上的访问地址
     */
    String uploadAiCorrectImage(Integer userId, MultipartFile file);

    /**
     * 上传题库图片
     *
     * @param file 要上传的图片文件
     * @return 图片在OSS上的访问地址
     */
    String uploadQuestionImg(MultipartFile file);

    /**
     * 上传教材
     *
     * @param file       要上传教材的文件
     * @param folderName 文件夹名称
     * @return 文件访问URL
     */
    String uploadTextBook(MultipartFile file, String folderName);

    /**
     * 通过输入流上传教材
     *
     * @param inputStream 要上传教材的输入流
     * @param fileName    文件名
     * @param folderName  文件夹名称
     * @param contentType 文件内容类型
     * @return 文件访问URL
     */
    String uploadTextBook(InputStream inputStream, String fileName, String folderName, String contentType);

    /**
     * 通过输入流上传
     *
     * @param inputStream 要上传的输入流
     * @param folderName  文件夹名称
     * @return 文件在OSS上的访问地址
     */
    String upload(InputStream inputStream,String bucketName, String folderName,String fileName,String contentType);

    /**
     * 通过输入流上传
     *
     * @param inputStream 要上传的输入流
     * @param folderName  文件夹名称
     * @return 文件在OSS上的访问地址
     */
    String upload(InputStream inputStream,String bucketName, String folderName,String contentType);

    /**
     * 从MinIO下载文件
     *
     * @param bucketName 存储桶名称
     * @param objectName 对象名称（包含文件夹路径）
     * @return 文件输入流
     * @throws Exception 可能抛出的异常
     */
    InputStream downloadFile(String bucketName, String objectName) throws Exception;

    /**
     * 从URL下载文件
     *
     * @param bucketName 存储桶名称
     * @param url        文件URL
     * @return 文件输入流
     * @throws Exception 抛出的异常
     */
    InputStream downloadFileFromUrl(String bucketName, String url) throws Exception;
}
