package com.ruoyi.platform.controller.model;


import com.ruoyi.common.core.web.controller.BaseController;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.core.web.domain.GenericsAjaxResult;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.platform.domain.Models;
import com.ruoyi.platform.domain.ModelsVersion;
import com.ruoyi.platform.service.ModelsService;
import com.ruoyi.platform.vo.ModelsVo;
import com.ruoyi.system.api.model.LoginUser;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.core.io.InputStreamResource;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.util.List;
import java.util.Map;

/**
 * (Models)表控制层
 *
 * @author Xidaray
 * @since 2023-11-28 16:21:30
 */
@RestController
@RequestMapping("models")
@Api("模型管理")
public class ModelsController extends BaseController {
    /**
     * 服务对象
     */
    @Resource
    private ModelsService modelsService;

    /**
     * 模型广场分页查询
     *
     * @param models 筛选条件
     * @param page     分页对象
     * @param size     分页对象
     * @return 查询结果
     */
    @GetMapping
    @ApiOperation("模型广场分页查询，可传model_type进行筛选")
    public GenericsAjaxResult<Page<Models>> queryByPage(Models models, @RequestParam("page") int page,
                                                        @RequestParam("size") int size,
                                                        @RequestParam("available_range") int availableRange,
                                                        @RequestParam(value = "model_type", required = false) String modelType,
                                                        @RequestParam(value = "model_tag", required = false) String modelTag) {
        if (modelType != null){
            models.setModelType(modelType); // 设置筛选条件
        }
        if (modelTag != null){
            models.setModelTag(modelTag); // 设置筛选条件
        }
        models.setAvailableRange(availableRange); // 设置筛选条件
        PageRequest pageRequest = PageRequest.of(page, size);
        return genericsSuccess(this.modelsService.queryByPage(models, pageRequest));

    }


    /**
     * 个人模型分页查询
     *
     * @param models 筛选条件
     * @param page     分页对象
     * @param size     分页对象
     * @return 查询结果
     */
    @GetMapping("/personalModels")
    @ApiOperation("分页查询当前用户的个人模型 ，根据model_type筛选")
    public GenericsAjaxResult<Page<Models>> queryByPagePersonal(Models models, @RequestParam("page") int page,
                                                                @RequestParam("size") int size,
                                                                @RequestParam(value = "model_type", required = false) String modelType,
                                                                @RequestParam(value = "model_tag", required = false) String modelTag) {
        // 获取当前用户的认证信息
        LoginUser loginUser = SecurityUtils.getLoginUser();
        // 设置筛选条件
        models.setCreateBy(loginUser.getUsername());
        if (modelType != null){
            models.setModelType(modelType); // 设置筛选条件
        }
        if (modelTag != null){
            models.setModelTag(modelTag); // 设置筛选条件
        }
        PageRequest pageRequest = PageRequest.of(page, size);
        return genericsSuccess(this.modelsService.queryByPage(models, pageRequest));
    }


    /**
     * 通过主键查询单条数据
     *
     * @param id 主键
     * @return 单条数据
     */
    @GetMapping("{id}")
    @ApiOperation("根据id查询")
    public GenericsAjaxResult<Models> queryById(@PathVariable("id") Integer id) {
        return genericsSuccess(this.modelsService.queryById(id));
    }

    @GetMapping("/versions/{modelId}")
    @ApiOperation(value = "获取模型的所有版本", notes = "根据模型ID获取该模型的所有版本信息。")
    public GenericsAjaxResult<List<String>> getModelVersions(@PathVariable("modelId") Integer modelId) throws Exception {
        return genericsSuccess(this.modelsService.getModelVersions(modelId));
    }


    /**
     * 新增数据
     *
     * @param models 实体
     * @return 新增结果
     */
    @PostMapping
    @ApiOperation("添加模型")
    public GenericsAjaxResult<Models> add(@RequestBody Models models) throws Exception {
        return genericsSuccess(this.modelsService.insert(models));
    }


    /**
     * 新增数据
     *
     * @param modelsVo 实体
     * @return 新增结果
     */
    @PostMapping("/addModelAndVersion")
    @ApiOperation("添加模型和版本")
    public GenericsAjaxResult<String> addModelAndVersion(@RequestBody ModelsVo modelsVo) throws Exception {
        return genericsSuccess(this.modelsService.insertModelAndVersion(modelsVo));




    }

    /**
     * 编辑数据
     *
     * @param models 实体
     * @return 编辑结果
     */
    @PutMapping
    @ApiOperation("编辑模型")
    public GenericsAjaxResult<Models> edit(@RequestBody Models models) {
        return  genericsSuccess(this.modelsService.update(models));
    }

    /**
     * 删除数据
     *
     * @param id 主键
     * @return 删除是否成功
     */
    @DeleteMapping("{id}")
    @ApiOperation("删除模型")
    public GenericsAjaxResult<String> deleteById(@PathVariable("id") Integer id) throws Exception {
        return  genericsSuccess(this.modelsService.removeById(id));
    }

    /**
     * 模型上传
     *
     *
     *
     * @param files 文件
//     * @param modelsId 模型表主键
     * @return 上传结果
     */

    @CrossOrigin(origins = "*", allowedHeaders = "*")
    @PostMapping("/upload")
    @ApiOperation(value = "上传模型", notes = "根据模型id上传模型文件，并将信息存入数据库。")
    public GenericsAjaxResult<List<Map<String, String>>> uploadModels(@RequestParam("file") MultipartFile[] files , @RequestParam("uuid") String uuid) throws Exception {
        return  genericsSuccess(this.modelsService.uploadModels(files,uuid));

    }

    /**
     * 从流水线上传模型，不会给二进制文件，这边只存路径
     * @return 上传结果
     */
    @PostMapping("/upload_pipeline")
    @ApiOperation("从流水线上传模型,并将信息存入数据库")
    public GenericsAjaxResult<Map> uploadModelsPipeline(@RequestBody(required =false) ModelsVersion modelsVersion) throws Exception {
        return  genericsSuccess(this.modelsService.uploadModelsPipeline(modelsVersion));
    }

    /**
     * 模型单个文件下载
     *
     *@param models_version_id 模型版本表主键
     * @return 单条数据
     */
    @GetMapping("/download_model/{models_version_id}")
    @ApiOperation(value = "下载模型", notes = "根据模型版本表id下载模型文件。")
    public ResponseEntity<InputStreamResource> downloadModels(@PathVariable("models_version_id") Integer models_version_id) throws Exception {
        return modelsService.downloadModels(models_version_id);
    }

    /**
     * 模型打包下载
     *
     * @param modelsId 模型版本表主键
     * @param version  模型版本表主键
     * @return 单条数据
     */
    @GetMapping("/downloadAllFiles")
    @ApiOperation(value = "下载模型压缩包", notes = "根据模型ID和版本下载所有模型文件，并打包。")
    public ResponseEntity<InputStreamResource> downloadAllModelFiles(@RequestParam("models_id") Integer modelsId, @RequestParam("version") String version) throws Exception {
        return modelsService.downloadAllModelFiles(modelsId, version);
    }



    @GetMapping("/readme")
    @ApiOperation(value = "读取README文件", notes = "读取README文件并返回String类型。")
    public GenericsAjaxResult<String> readFileContent(@RequestParam("models_id") Integer modelsId, @RequestParam("version") String version) throws Exception {
        return genericsSuccess(this.modelsService.readFileContent(modelsId,version));

    }

    @PostMapping("/exportModel")
    @ApiOperation(value = "导出模型", notes = "将流水线产物导出到模型。")
    public AjaxResult exportModels(@RequestBody Map map) throws Exception {
        String path = (String) map.get("path");
        String uuid = (String) map.get("uuid");
        return AjaxResult.success(this.modelsService.exportModels(path, uuid));
    }



}

