package io.renren.modules.sys.controller.dataset;

import io.minio.errors.*;
import io.renren.common.annotation.SysLog;
import io.renren.common.utils.Constant;
import io.renren.common.utils.MinIoUtils;
import io.renren.common.utils.PageUtils;
import io.renren.common.utils.R;
import io.renren.common.validator.ValidatorUtils;
import io.renren.common.validator.group.AddGroup;
import io.renren.common.validator.group.UpdateGroup;
import io.renren.modules.sys.entity.algs.AlgorithmModel;
import io.renren.modules.sys.entity.algs.FileTest;
import io.renren.modules.sys.entity.dataset.DataSet;
import io.renren.modules.sys.service.DataSetService;
import io.renren.modules.sys.service.impl.AlgsModelsServiceImpl;
import lombok.SneakyThrows;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Map;

import static io.renren.common.utils.ShiroUtils.getUserId;

/**
 * @Author: Ivan Q
 * @Date: 2021/6/9 13:46
 */
@RestController
@RequestMapping("/dataset")
public class DataSetController {

    @Autowired
    DataSetService dataSetService;
    /**
     * 所有列表
     */
    @GetMapping("/list")
    /*
    把这个@RequiresPermissions注解去掉，那么如果在角色管理中，去掉查看功能的话也可以获取列表，但是没有每条数据右侧的查看按钮；
    不去掉的话那就是必须在打开查看模板功能，否则不能获取列表数据。
     */
    @RequiresPermissions("dataset:list")
    public R list(@RequestParam Map<String, Object> params){
        //只有超级管理员，才能查看所有模板列表
        //先这样写，之后去掉
        if(getUserId() != Constant.SUPER_ADMIN){
            params.put("createUserId", getUserId());
        }
        PageUtils page = dataSetService.queryPageOnUse(params);

        return R.ok().put("page", page);
    }

    /**
     * 信息
     */
    @GetMapping("/info/{datesetId}")
    @RequiresPermissions("dataset:info")
    public R info(@PathVariable("datesetId") Long datesetId){
        DataSet dataSet = dataSetService.getById(datesetId);
//        Long categoryId = algsTemplsService.querycategoryId(tmpId);
//        temp.setCategoryId((categoryId));

//        不需要获取创建人的信息，总的列表中已经有了
//        String username = userService.getById(temp.getUid()).getUsername();
        return R.ok().put("dataset", dataSet);
    }

    /**
     * 保存
     */
    @SysLog("保存数据集")
    @PostMapping("/save")
    @RequiresPermissions("dataset:save")
    public R save(@RequestBody DataSet dataSetToSave){
        ValidatorUtils.validateEntity(dataSetToSave, AddGroup.class);
        List<DataSet> list = dataSetService.list();
        for(DataSet dataSet : list){
            if(dataSet.getDatasetName().equals(dataSetToSave.getDatasetName())) return R.error("已经存在重复名称的数据集");
        }
        dataSetToSave.setCreateTime(new Date());
//        user.setCreateUserId(getUserId());
        dataSetService.save(dataSetToSave);

        return R.ok();
    }

    /**
     * 修改
     */
    @SysLog("修改数据集")
    @PostMapping("/update")
    @RequiresPermissions("dataset:update")
    public R update(@RequestBody DataSet dataSet){
        System.out.println("@@@@@@@@@@@@@@@@@@@@@@");
        System.out.println(dataSet);
        ValidatorUtils.validateEntity(dataSet, UpdateGroup.class);

//        model.setCreateUserId(getUserId());
        dataSetService.update(dataSet);

        return R.ok();
    }

    /**
     * 删除
     */
    @SneakyThrows
    @SysLog("删除数据集")
    @PostMapping("/delete")
    @RequiresPermissions("dataset:delete")
    public R delete(@RequestBody Long[] datasetIds){

        List<DataSet> dataSets = dataSetService.listByIds(Arrays.asList(datasetIds));
        dataSetService.deleteBatch(datasetIds);
        System.out.println(dataSets);
        for (DataSet dataset:dataSets
             ) {
            MinIoUtils.deleteFile("dataset",dataset.getDatasetName()+".csv");
        }
        return R.ok();
    }

    @GetMapping("/listAll")
    public R listAll() throws Exception {
        List<FileTest> list=MinIoUtils.listBucketFiles("dataset");

        return R.ok().put("list",list);
    }

    /**
     * Description 下载数据集
     * @param datasetName
     * @return
     */
    @RequestMapping("/downloadDataset")
    public R downloadStaticDataset(String datasetName){
        //从minio获得数据集的url，直接返回给前端
        String downloadUrl= MinIoUtils.getFileUrl("dataset",datasetName);
        return R.ok().put("downloadUrl",downloadUrl);
    }


}
