package com.vctgo.system.api;

import com.alibaba.fastjson2.JSONObject;
import com.vctgo.common.core.constant.ServiceNameConstants;
import com.vctgo.common.core.domain.R;
import com.vctgo.common.core.web.domain.AjaxResult;
import com.vctgo.system.api.config.FeignConfig;
import com.vctgo.system.api.domain.FileInfo;
import com.vctgo.system.api.factory.RemoteFileFallbackFactory;
import io.swagger.annotations.ApiOperation;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.http.MediaType;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

/**
 * 文件服务
 *
 * @author vctgo
 */
@FeignClient(contextId = "remoteFileService", value = ServiceNameConstants.FILE_SERVICE, fallbackFactory = RemoteFileFallbackFactory.class,configuration = FeignConfig.class)
public interface RemoteFileService {
    /**
     * 上传文件
     *
     * @param file 文件信息
     * @return 结果
     */
    @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    R<FileInfo> upload(@RequestPart(value = "file") MultipartFile file);

    /**
     * 创建文件夹
     *
     * @param parentId 文件夹父Id
     * @param dirName  文件夹名称
     * @return
     */
    @ApiOperation(value = "创建文件夹")
    @PostMapping("/cloudStorage/mkdir")
    R<FileInfo> mkdir(@RequestParam("parentId") String parentId,
                      @RequestParam("dirName") String dirName);

    /**
     * 通过租户Id创建文件夹
     *
     * @param tenantId 租户Id
     * @param parentId 文件夹父Id
     * @param dirName  文件夹名称
     * @return
     */
    @ApiOperation(value = "通过租户Id创建文件夹")
    @PostMapping("/cloudStorage/mkdir/tenant/id")
    R<FileInfo> mkdirByTenantId(@RequestParam("tenantId") Long tenantId,
                                @RequestParam("parentId") String parentId,
                                @RequestParam("dirName") String dirName);


    /**
     * 更新文件服务Id信息
     *
     * @param serviceName 业务名称
     * @param serviceId   业务Id
     * @param ids         记录文件的id数组
     * @return
     */
    @PostMapping("/updateFileServiceIdAndServiceNameByIds")
    R updateFileServiceIdAndServiceNameByIds(@RequestParam("serviceName") String serviceName,
                                             @RequestParam("serviceId") String serviceId,
                                             @RequestParam("ids") String ids);

    /**
     * 通过文件Ids获取文件信息
     *
     * @param ids 文件Ids
     * @return
     */
    @GetMapping("/selectUrlById/{ids}")
    R<List<FileInfo>> selectUrlByIds(@PathVariable("ids") String ids);

    /**
     * minio删除文件
     *
     * @param ids 文件ID集合
     * @return
     */
    @GetMapping("/minio/{ids}")
    R<Integer> minioDelete(@PathVariable("ids") Long[] ids);

    /**
     * 分页--忽略租户的云盘获取列表
     */
    @GetMapping("/cloudStorage/inner/page/neglect/tenant")
    R<JSONObject> pageFileInfoNeglectTenant(@RequestParam("fileInfo") String fileInfo,
                                            @RequestParam("pageNum") Integer pageNum,
                                            @RequestParam("pageSize") Integer pageSize);

    /**
     * 不分页--通过文件Id获取文件列表信息
     */
    @GetMapping("/cloudStorage/inner/list/file")
    R<JSONObject> innerListFile(@RequestParam("fileInfo") String fileInfo,
                                @RequestParam("pageNum") Integer pageNum,
                                @RequestParam("pageSize") Integer pageSize);

    /**
     * 云盘通过文件对象创建文件夹
     */
    @PostMapping("/cloudStorage/mkdir/file")
    R<String> mkdirByFileInfo(@RequestParam("parentId") String parentId,
                              @RequestParam("fileInfo") String fileInfo);

    /**
     * 通过租户和文件对象创建文件夹
     *
     * @param tenantId 租户Id
     * @param parentId 文件夹父Id
     * @param fileInfo 文件夹名称
     * @return
     */
    @PostMapping("/cloudStorage/mkdir/tenant/file")
    R<String> mkdirByTenantAndFile(@RequestParam("tenantId") Long tenantId,
                                   @RequestParam("parentId") String parentId,
                                   @RequestParam("fileInfo") String fileInfo);


    /**
     * 通过文件id修改对应的文件名称
     *
     * @param fileId
     * @param fileInfo
     * @return
     */
    @PostMapping("/cloudStorage/update/file/info")
    R updateFileInfo(@RequestParam("fileId") String fileId,
                     @RequestParam("fileInfo") String fileInfo);

    /**
     * 服务间调用--云盘通过文件id批量移动文件/文件夹
     */
    @PostMapping("/cloudStorage/inner/move/file")
    R innerMoveFileByIds(@RequestParam("ids") String ids,
                         @RequestParam("toParentId") String toParentId);

    /**
     * 服务内部使用--云盘通过文件id删除文件/文件夹
     *
     * @param fileInfo
     * @return
     */
    @PostMapping("/cloudStorage/inner/delete/file")
    R innerDeleteFileByIds(@RequestParam("fileInfo") String fileInfo);

    /**
     * 服务间调用--云盘通过文件id批量隐藏文件/文件夹---》回收站
     */
    @PostMapping("/cloudStorage/inner/hide/file")
    R innerHideFileByIds(@RequestParam("fileInfoList") String fileInfoList);

    /**
     * 云盘通过文件id批量恢复文件/文件夹
     *
     * @param recoverFileList
     * @return
     */
    @PostMapping("/cloudStorage/inner/recover/file")
    R innerRecoverFileByIds(@RequestParam("recoverFileList") String recoverFileList);

    /**
     * 服务间调用--通过租户Id和服务名创建默认文件夹
     * @param tenantId
     * @param serviceName
     * @return
     */
    @GetMapping("/atAll/inner/init")
    R initMkdirByTenantId(@RequestParam("tenantId") Long tenantId,@RequestParam("serviceName") String serviceName,@RequestParam("fileName") String fileName);

    /**
     * 服务间调用 -- 通过文件Id逻辑删除文件、文件夹
     * @param fileIds 文件、文件夹ID集合
     * @return
     */
    @GetMapping("/logicalDelete/{fileIds}")
    R deleteFileByFileIds (@PathVariable("fileIds") String fileIds);

    /**
     * 服务间调用--云盘文件上传请求
     */
    @PostMapping(value = "/cloudStorage/inner/upload",consumes = {"multipart/form-data"})
    R<FileInfo> innerUpload(@RequestPart("file") MultipartFile file);
}
