package net.northking.cctp.common.s3;

import net.northking.cctp.common.enums.FileBusinessTypeEnum;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;

/**
 * 文件存储服务
 */
public interface SimpleStorageService
{
  /**
   * 上传文件
   *
   * @param tenant        租户
   * @param multipartFile 文件
   * @param objId 关联对象Id
   * @param businessCode 文件业务类型枚举
   * @return 文件记录
   * @throws FileUploadException 异常
   */
  NKFile upload(String tenant, MultipartFile multipartFile, String objId, FileBusinessTypeEnum businessCode) throws FileUploadException, IOException;

  /**
   * 文件分片上传
   *
   * @param tenantId      租户id
   * @param multipartFile 文件
   * @param uploadId      uploadId
   * @param chunkIndex       分片下标
   * @return 文件记录
   * @throws FileUploadException 异常
   */
  NKFile uploadChunk(String tenantId, MultipartFile multipartFile, String uploadId, String chunkIndex) throws FileUploadException, IOException;

  /**
   * 合并分片文件
   * @param tenantId
   * @param uploadId
   * @param suffixName  文件后缀名
   * @return
   */
  NKFile mergeChunkFiles(String tenantId, String uploadId, String suffixName) throws FileUploadException;

  /**
   * 上传文件
   *
   * @param tenant 租户
   * @param file   文件
   * @return 文件记录
   * @throws FileUploadException 异常
   */
  NKFile upload(String tenant, File file, String objId, FileBusinessTypeEnum businessCode) throws FileUploadException;

  /**
   * 上传文件
   * @param tenant 租户
   * @param file 文件
   * @param idDashFlag id转成下划线标志，true为需要转换，false为不需要
   * @return
   * @throws FileUploadException
   */
  NKFile upload(String tenant, File file, boolean idDashFlag, String obj, FileBusinessTypeEnum businessCode) throws FileUploadException;

  /**
   * 更新文件
   * @param fileId 文件id
   * @param file 文件
   * @return
   */
  NKFile update(String fileId, File file) throws FileUploadException;

  /**
   * 删除文件
   * @param tenant 租户ID
   * @param fileId 附件ID
   */
  void delete(String tenant, String fileId) throws Exception;

  /**
   * 下载文件
   *
   * @param tenant 租户
   * @param fileId 文件ID
   * @return 文件流
   * @throws FileDownloadException 异常
   */
  InputStream downloadAsStream(String tenant, String fileId) throws FileDownloadException;

  /**
   * 下载文件
   *
   * @param tenant 租户
   * @param fileId 文件ID
   * @return 文件
   * @throws FileDownloadException 异常
   */
  File downloadAsFile(String tenant, String fileId) throws FileDownloadException;

  void getFileAndDirectResponseToHttp(ServletOutputStream out, String fileId) throws FileDownloadException;

  void deleteFile(String fileId) throws Exception;
}
