package com.schisandra.oss.application.controller;

import cn.hutool.extra.spring.SpringUtil;
import com.alibaba.fastjson.JSON;
import com.google.common.base.Preconditions;
import com.schisandra.oss.application.convert.SchisandraOssMinioDTOConverter;
import com.schisandra.oss.application.dto.SchisandraOssMinioDTO;
import com.schisandra.oss.application.oss.core.minio.MinioOssClient;
import com.schisandra.oss.application.oss.core.minio.MinioOssConfiguration;
import com.schisandra.oss.common.entity.Result;
import com.schisandra.oss.common.redis.RedisUtil;
import com.schisandra.oss.domain.bo.SchisandraOssMinioBO;
import com.schisandra.oss.domain.service.SchisandraOssMinioDomainService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

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

/**
 * controller
 *
 * @author landaiqing
 * @since 2024-05-14 19:47:04
 */
@RestController
@RequestMapping("/oss/minio/")
@Slf4j
public class SchisandraOssMinioController {
    @Resource
    MinioOssClient minioOssClient;

    @Resource
    private SchisandraOssMinioDomainService schisandraOssMinioDomainService;
    @Resource
    MinioOssConfiguration minioOssConfiguration;

    @Resource
    RedisUtil redisUtil;


    /**
     * @description: minio 初始化
     * @param: []
     * @return: void
     * @author: landaiqing
     * @date: 2024/5/15 13:34
     */
    @PostMapping("init")
    public void initMinio(@RequestParam String userId) {
        if (log.isInfoEnabled()) {
            log.info("SchisandraOssMinioController.init.userId:{}", userId);
        }
        Preconditions.checkNotNull(userId, "用户id不能为空！");

        Result result = minioOssConfiguration.minioOssClient(userId);
        if (result.getSuccess()) {
            log.info("用户: " + userId + "-> minio 初始化完成！");
        } else {
            log.error("用户: " + userId + "-> minio 初始化完成！");
        }
    }

    @PostMapping("get")
    public SchisandraOssMinioDTO getMinioOss(@RequestParam String userId) {
        return SchisandraOssMinioDTOConverter.INSTANCE.convertBOToDTO(schisandraOssMinioDomainService.getMinioConfig(Long.valueOf(userId)));
    }

    /**
     * 新增
     */
    @PostMapping("add")
    @RequestMapping("add")
    public Result<Boolean> addMinioOss(@RequestBody SchisandraOssMinioDTO schisandraOssMinioDTO) {

        try {
            if (log.isInfoEnabled()) {
                log.info("SchisandraOssMinioController.add.dto:{}", JSON.toJSONString(schisandraOssMinioDTO));
            }

//            parameterCheck(schisandraOssMinioDTO);
            SchisandraOssMinioBO SchisandraOssMinioBO = SchisandraOssMinioDTOConverter.INSTANCE.convertDTOToBO(schisandraOssMinioDTO);
            return Result.ok(schisandraOssMinioDomainService.add(SchisandraOssMinioBO));
        } catch (Exception e) {
            log.error("SchisandraOssMinioController.register.error:{}", e.getMessage(), e);
            return Result.fail("新增失败");
        }

    }

    /**
     * 修改
     */
    @PostMapping("update")
    public Result<Boolean> updateMinioOss(@RequestBody SchisandraOssMinioDTO schisandraOssMinioDTO) {

        try {
            if (log.isInfoEnabled()) {
                log.info("SchisandraOssMinioController.update.dto:{}", JSON.toJSONString(schisandraOssMinioDTO));
            }
            parameterCheck(schisandraOssMinioDTO);
            SchisandraOssMinioBO schisandraOssMinioBO = SchisandraOssMinioDTOConverter.INSTANCE.convertDTOToBO(schisandraOssMinioDTO);
            return Result.ok(schisandraOssMinioDomainService.update(schisandraOssMinioBO));
        } catch (Exception e) {
            log.error("SchisandraOssMinioController.update.error:{}", e.getMessage(), e);
            return Result.fail("更新信息失败");
        }

    }

    /**
     * 删除
     */
    @DeleteMapping("delete")
    public Result<Boolean> deleteMinioOss(@RequestBody SchisandraOssMinioDTO schisandraOssMinioDTO) {

        try {
            if (log.isInfoEnabled()) {
                log.info("SchisandraOssMinioController.delete.dto:{}", JSON.toJSONString(schisandraOssMinioDTO));
            }
            parameterCheck(schisandraOssMinioDTO);
            SchisandraOssMinioBO schisandraOssMinioBO = SchisandraOssMinioDTOConverter.INSTANCE.convertDTOToBO(schisandraOssMinioDTO);
            return Result.ok(schisandraOssMinioDomainService.delete(schisandraOssMinioBO));
        } catch (Exception e) {
            log.error("SchisandraOssMinioController.delete.error:{}", e.getMessage(), e);
            return Result.fail("删除信息失败");
        }

    }

    @PostMapping("getBaseInfo")
    public Result getBaseInfo(@RequestParam String fileName, @RequestParam String userId) {
        MinioOssClient bean = SpringUtil.getBean(userId);
        if (bean == null) {
            log.error("容器获取失败！");
            return null;
        }
        return Result.ok(bean.getBaseInfo(fileName));
    }

    @GetMapping("getAllMinioInfo")
    public Result<List<SchisandraOssMinioDTO>> getAllMinioInfo() {
        List<SchisandraOssMinioBO> allMinioInfo = schisandraOssMinioDomainService.getAllMinioInfo();
        List<SchisandraOssMinioDTO> schisandraOssMinioDTOS = SchisandraOssMinioDTOConverter.INSTANCE.convertBOToDTOList(allMinioInfo);
        return Result.ok(schisandraOssMinioDTOS);
    }


    private void parameterCheck(SchisandraOssMinioDTO schisandraOssMinioDTO) {
        Preconditions.checkNotNull(schisandraOssMinioDTO.getId(), "不能为空");
        Preconditions.checkNotNull(schisandraOssMinioDTO.getUserId(), "不能为空");
        Preconditions.checkNotNull(schisandraOssMinioDTO.getEndpoint(), "不能为空");
        Preconditions.checkNotNull(schisandraOssMinioDTO.getAccessKey(), "不能为空");
        Preconditions.checkNotNull(schisandraOssMinioDTO.getSecretKey(), "不能为空");
        Preconditions.checkNotNull(schisandraOssMinioDTO.getBucketName(), "不能为空");
        Preconditions.checkNotNull(schisandraOssMinioDTO.getPort(), "不能为空");
        Preconditions.checkNotNull(schisandraOssMinioDTO.getBasePath(), "不能为空");
        Preconditions.checkNotNull(schisandraOssMinioDTO.getFileHost(), "不能为空");
        Preconditions.checkNotNull(schisandraOssMinioDTO.getDownloadHost(), "不能为空");
        Preconditions.checkNotNull(schisandraOssMinioDTO.getUploadHost(), "不能为空");
        Preconditions.checkNotNull(schisandraOssMinioDTO.getCreateBucket(), "当桶不存在，是否创建不能为空");
        Preconditions.checkNotNull(schisandraOssMinioDTO.getCheckBucket(), "启动检测桶，是否存在不能为空");
        Preconditions.checkNotNull(schisandraOssMinioDTO.getConnectTimeout(), "连接超时时间（单位：毫秒）不能为空");
        Preconditions.checkNotNull(schisandraOssMinioDTO.getWriteTimeout(), "写超时时间（单位：毫秒）不能为空");
        Preconditions.checkNotNull(schisandraOssMinioDTO.getReadTimeout(), "读超时时间（单位：毫秒）不能为空");
        Preconditions.checkNotNull(schisandraOssMinioDTO.getCallTimeout(), "调用超时时间（单位：毫秒）不能为空");
        Preconditions.checkNotNull(schisandraOssMinioDTO.getFollowRedirects(), "是否支持重定向，默认支持不能为空");
        Preconditions.checkNotNull(schisandraOssMinioDTO.getFollowSslRedirects(), "是否支持HTTP到HTTPS，HTTPS到HTTP的重定向，默认支持不能为空");
        Preconditions.checkNotNull(schisandraOssMinioDTO.getRetryOnConnectionFailure(), "是否开始连接失败重试，默认不支持不能为空");
        Preconditions.checkNotNull(schisandraOssMinioDTO.getPingInterval(), "连接健康检测间隔时长（单位：毫秒）不能为空");
        Preconditions.checkNotNull(schisandraOssMinioDTO.getPartSize(), "分片大小,默认5MB不能为空");
        Preconditions.checkNotNull(schisandraOssMinioDTO.getTaskNum(), "并发线程数,默认等于CPU的核数不能为空");
        Preconditions.checkNotNull(schisandraOssMinioDTO.getImgSize(), "图片大小限制，单位：m不能为空");
        Preconditions.checkNotNull(schisandraOssMinioDTO.getFileSize(), "文件大小限制，单位：m不能为空");
        Preconditions.checkNotNull(schisandraOssMinioDTO.getExtraJson(), "额外json不能为空");
        Preconditions.checkNotNull(schisandraOssMinioDTO.getStatus(), "状态不能为空");
        Preconditions.checkNotNull(schisandraOssMinioDTO.getCreatedBy(), "创建人不能为空");
        Preconditions.checkNotNull(schisandraOssMinioDTO.getCreatedTime(), "创建时间不能为空");
        Preconditions.checkNotNull(schisandraOssMinioDTO.getUpdateTime(), "更新时间不能为空");
        Preconditions.checkNotNull(schisandraOssMinioDTO.getUpdateBy(), "更新人不能为空");
        Preconditions.checkNotNull(schisandraOssMinioDTO.getIsDeleted(), "是否删除 0 未删除 1已删除不能为空");
        Preconditions.checkNotNull(schisandraOssMinioDTO.getOpenAdvancedSetup(), "是否开启高级设置不能为空");
    }

}
