package digital.laboratory.platform.imr.service;

import com.deepoove.poi.XWPFTemplate;
import digital.laboratory.platform.sys.entity.SysOrg;
import digital.laboratory.platform.sys.entity.SysUser;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayInputStream;
import java.util.List;
import java.util.Map;

/**
 * 通用的feign请求封装接口服务层接口
 */
public interface CommonFeignService {

    /**
     * 远程调用获取用户机构
     * @param orgId
     * @return
     */
    SysOrg remoteGetSysOrg(String orgId);

    /**
     * 根据机构id远程获取系统子机构信息
     *
     * @param orgId 用户信息
     * @return 对应的远程系统机构信息
     * @throws RuntimeException 如果未找到对应的机构信息，则抛出运行时异常
     */
    List<SysOrg> remoteGetSysOrgByParentId(String orgId);

    /**
     * 远程调用获取用户信息
     * @param username
     * @return
     */
    SysUser remoteGetUserByUsername(String username);

    /**
     * 远程调用获取用户信息
     * @param userId
     * @return
     */
    SysUser remoteGetUserById(String userId);

    /**
     * 远程调用生成word,并转成pdf
     *
     * @param template
     * @param originalFilename 文件名
     * @param savePath         保存到minio路径
     * @return
     * @throws Exception
     */
    boolean remoteGenerateWord2PDF(XWPFTemplate template, String originalFilename, String savePath) throws Exception;

    /**
     * 远程调用根据文件路径获取文件
     * @param filePath minio上的文件路径
     * @return
     * @throws Exception
     */
    ByteArrayInputStream remoteGetFile(String filePath) throws Exception;

    /**
     * 远程调用根据文件路径获取文件
     * @param filePath minio上的文件路径
     * @param fileName 名称
     * @param httpServletResponse
     * @throws Exception
     */
    void remoteGetFile(String filePath, String fileName, HttpServletResponse httpServletResponse) throws Exception;

    /**
     * 远程调用根据文件路径获取文件列表
     * @param filePath minio上的文件路径
     */
    List<String> remoteGetFileList(String filePath);

    /**
     * 远程调用-上传文件
     * @param file 上传的文件对象
     * @param path 上传到minio的位置
     * @return
     */
    Map<String, String> remoteUploadFile(MultipartFile file, String path);

    /**
     * 远程调用，柜子里的检材出库
     * @param cellId 检材存储的格子id
     * @param sampleId 存放的检材id
     */
    void remoteCabinetOutbound(String cellId, String sampleId);
}
