package com.trade.service.filestorage.service;

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

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.trade.service.filestorage.dto.FileAbstractDto;
import org.springframework.ui.Model;
import org.springframework.web.multipart.MultipartFile;

import com.trade.service.filestorage.entity.TFileStorage;
import com.trade.service.filestorage.enums.FileModuleEnum;

public interface OSSFileService {

    /**
     * 上传文件到OSS，并保存数据库记录
     *
     * @param file 文件对象
     * @param fileDestDir 文件保存目录
     * @return TFileStorage
     */
    TFileStorage uploadAndSaveDBRecord(File file, String fileDestDir);

    /**
     * OSS单个文件上传
     *
     * @param file MultipartFile
     * @param fileDestDir 文件保存目录
     */
    FileAbstractDto uploadFile(MultipartFile file, String fileDestDir);

    /**
     * 上传文件到OSS，并保存数据库记录
     * 
     * @param file 文件对象
     * @param fileModuleEnum 文件模块
     * @return TFileStorage
     */
    TFileStorage uploadAndSaveDBRecord(File file, FileModuleEnum fileModuleEnum);

    /**
     * 新增文件保存 With MultipartFile
     *
     * @param multipartFile MultipartFile对象
     * @param fileDestDir fileDestDir 文件保存目录
     * @return TFileStorage对象
     */
    TFileStorage addStorage(MultipartFile multipartFile, String fileDestDir) throws IOException;

    /**
     * 新增文件保存 With MultipartFile
     *
     * @param multipartFile MultipartFile对象
     * @param fileModule 文件模块枚举
     * @return TFileStorage对象
     */
    TFileStorage addStorage(MultipartFile multipartFile, FileModuleEnum fileModule) throws IOException;

    /**
     * OSS单个文件上传
     *
     * @param file MultipartFile
     * @param moduleDict moduleDict
     */
    FileAbstractDto uploadFile(MultipartFile file, FileModuleEnum moduleDict);

    /**
     * OSS文件上传
     * 
     * @param request HttpServletRequest
     * @param moduleDict moduleDict
     */
    void uploadFile(HttpServletRequest request, FileModuleEnum moduleDict);

    /**
     * OSS文件下载
     * <p>
     * 此处实现方式可以有两种， 1. 直接返回文件流，前端通过canvas进行下载， 2. 返回文件下载地址，前端直接下载
     * </p>
     *
     * @param request HttpServletRequest
     * @param res HttpServletResponse
     * @param fileId 文件ID
     */
    void downloadFile(HttpServletRequest request, HttpServletResponse res, Long fileId);

    /**
     * OSS预览文件（加水印）
     *
     * @param fileId 文件id
     * @param request HttpServletRequest
     * @param response HttpServletResponse
     * @param model Model
     * @param watermarkText 水印文字
     * @return String
     */
    String previewFile(Long fileId, HttpServletRequest request, HttpServletResponse response, Model model,
            String watermarkText);

    /**
     * 获取文件输入流
     * 
     * @param fileKey oss key
     * @return InputStream
     */
    InputStream getFileInputStream(String fileKey);

    /**
     * 根据文件url下载文件到OSS，并保存数据库记录
     * 
     * @param originalName 文件名
     * @param fileUrl 文件url
     * @param moduleType 文件模块
     * @return TFileStorage
     */
    TFileStorage downloadFileFromUrl(String originalName, String fileUrl, FileModuleEnum moduleType);

    /**
     * 根据字节流上传文件到OSS，并保存数据库记录
     * 
     * @param originalName 文件名
     * @param bytes 字节流
     * @param fileModule 文件模块
     * @return TFileStorage
     */
    TFileStorage addStorageWithBytes(String originalName, byte[] bytes, FileModuleEnum fileModule);

    /**
     * 根据base64Str上传文件到OSS，并保存数据库记录
     *
     * @param originalName 文件名
     * @param base64Str base64字符串
     * @param fileModule 文件模块
     * @return TFileStorage
     */
    TFileStorage addStorageWithBase64Str(String originalName, String base64Str, FileModuleEnum fileModule);
}
