package com.schisandra.oss.application.controller;

import com.alibaba.fastjson.JSON;
import com.google.common.base.Preconditions;
import com.schisandra.oss.application.convert.SchisandraOssTencentDTOConverter;
import com.schisandra.oss.application.dto.SchisandraOssTencentDTO;
import com.schisandra.oss.common.entity.Result;
import com.schisandra.oss.domain.bo.SchisandraOssTencentBO;
import com.schisandra.oss.domain.service.SchisandraOssTencentDomainService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

/**
 * 腾讯云对象存储配置表 controller
 *
 * @author landaiqing
 * @since 2024-06-02 21:38:56
 */
@RestController
@RequestMapping("/oss/tencent/")
@Slf4j
public class SchisandraOssTencentController {

    @Resource
    private SchisandraOssTencentDomainService schisandraOssTencentDomainService;

    /**
     * 新增腾讯云对象存储配置表
     */
    @RequestMapping("add")
    public Result<Boolean> add(@RequestBody SchisandraOssTencentDTO schisandraOssTencentDTO) {

        try {
            if (log.isInfoEnabled()) {
                log.info("SchisandraOssTencentController.add.dto:{}", JSON.toJSONString(schisandraOssTencentDTO));
            }
            Preconditions.checkNotNull(schisandraOssTencentDTO.getId(), "不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getUserId(), "不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getBasePath(), "不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getBucketName(), "不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getSecretId(), "不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getSecretKey(), "不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getRegion(), "地域不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getHttpProtocol(), "连接OSS所采用的协议（HTTP或HTTPS），默认为HTTPS。不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getEndPointSuffix(), "域名后缀不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getHttpProxyIp(), "http proxy代理，如果使用http proxy代理，需要设置IP与端口不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getHttpProxyPort(), "代理服务器端口不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getProxyUserName(), "代理服务器验证的用户名。不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getProxyPassword(), "代理服务器验证的密码。不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getUseBasicAuth(), "是否使用基本身份验证不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getSignExpired(), "多次签名的过期时间,单位秒不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getConnectionRequestTimeout(), "获取连接的超时时间, 单位ms不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getConnectionTimeout(), "默认连接超时, 单位ms不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getSocketTimeout(), "SOCKET读取超时时间, 单位ms不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getMaxConnectionsCount(), "最大HTTP连接数不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getIdleConnectionAlive(), "空闲连接存活时间不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getUserAgent(), "user_agent标识不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getReadLimit(), "读取限制不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getCiSpecialRequest(), "数据万象特殊请求配置不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getMaxErrorRetry(), "请求失败后最大的重试次数。默认3次。不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getExtraJson(), "额外json不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getStatus(), "状态不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getCreatedBy(), "创建人不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getCreatedTime(), "创建时间不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getUpdateTime(), "更新时间不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getUpdateBy(), "更新人不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getIsDeleted(), "是否删除 0 未删除 1已删除不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getOpenAdvancedSetup(), "是否开启高级设置不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getCreateBucket(), "当桶不存在，是否创建不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getCheckBucket(), "启动检测桶，是否存在不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getPartSize(), "分片大小,默认5MB不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getTaskNum(), "并发线程数,默认等于CPU的核数不能为空");
            SchisandraOssTencentBO SchisandraOssTencentBO = SchisandraOssTencentDTOConverter.INSTANCE.convertDTOToBO(schisandraOssTencentDTO);
            return Result.ok(schisandraOssTencentDomainService.add(SchisandraOssTencentBO));
        } catch (Exception e) {
            log.error("SchisandraOssTencentController.register.error:{}", e.getMessage(), e);
            return Result.fail("新增腾讯云对象存储配置表失败");
        }

    }

    /**
     * 修改腾讯云对象存储配置表
     */
    @RequestMapping("update")
    public Result<Boolean> update(@RequestBody SchisandraOssTencentDTO schisandraOssTencentDTO) {

        try {
            if (log.isInfoEnabled()) {
                log.info("SchisandraOssTencentController.update.dto:{}", JSON.toJSONString(schisandraOssTencentDTO));
            }
            Preconditions.checkNotNull(schisandraOssTencentDTO.getId(), "不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getUserId(), "不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getBasePath(), "不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getBucketName(), "不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getSecretId(), "不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getSecretKey(), "不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getRegion(), "地域不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getHttpProtocol(), "连接OSS所采用的协议（HTTP或HTTPS），默认为HTTPS。不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getEndPointSuffix(), "域名后缀不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getHttpProxyIp(), "http proxy代理，如果使用http proxy代理，需要设置IP与端口不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getHttpProxyPort(), "代理服务器端口不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getProxyUserName(), "代理服务器验证的用户名。不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getProxyPassword(), "代理服务器验证的密码。不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getUseBasicAuth(), "是否使用基本身份验证不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getSignExpired(), "多次签名的过期时间,单位秒不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getConnectionRequestTimeout(), "获取连接的超时时间, 单位ms不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getConnectionTimeout(), "默认连接超时, 单位ms不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getSocketTimeout(), "SOCKET读取超时时间, 单位ms不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getMaxConnectionsCount(), "最大HTTP连接数不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getIdleConnectionAlive(), "空闲连接存活时间不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getUserAgent(), "user_agent标识不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getReadLimit(), "读取限制不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getCiSpecialRequest(), "数据万象特殊请求配置不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getMaxErrorRetry(), "请求失败后最大的重试次数。默认3次。不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getExtraJson(), "额外json不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getStatus(), "状态不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getCreatedBy(), "创建人不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getCreatedTime(), "创建时间不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getUpdateTime(), "更新时间不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getUpdateBy(), "更新人不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getIsDeleted(), "是否删除 0 未删除 1已删除不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getOpenAdvancedSetup(), "是否开启高级设置不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getCreateBucket(), "当桶不存在，是否创建不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getCheckBucket(), "启动检测桶，是否存在不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getPartSize(), "分片大小,默认5MB不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getTaskNum(), "并发线程数,默认等于CPU的核数不能为空");
            SchisandraOssTencentBO schisandraOssTencentBO = SchisandraOssTencentDTOConverter.INSTANCE.convertDTOToBO(schisandraOssTencentDTO);
            return Result.ok(schisandraOssTencentDomainService.update(schisandraOssTencentBO));
        } catch (Exception e) {
            log.error("SchisandraOssTencentController.update.error:{}", e.getMessage(), e);
            return Result.fail("更新腾讯云对象存储配置表信息失败");
        }

    }

    /**
     * 删除腾讯云对象存储配置表
     */
    @RequestMapping("delete")
    public Result<Boolean> delete(@RequestBody SchisandraOssTencentDTO schisandraOssTencentDTO) {

        try {
            if (log.isInfoEnabled()) {
                log.info("SchisandraOssTencentController.delete.dto:{}", JSON.toJSONString(schisandraOssTencentDTO));
            }
            Preconditions.checkNotNull(schisandraOssTencentDTO.getId(), "不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getUserId(), "不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getBasePath(), "不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getBucketName(), "不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getSecretId(), "不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getSecretKey(), "不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getRegion(), "地域不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getHttpProtocol(), "连接OSS所采用的协议（HTTP或HTTPS），默认为HTTPS。不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getEndPointSuffix(), "域名后缀不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getHttpProxyIp(), "http proxy代理，如果使用http proxy代理，需要设置IP与端口不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getHttpProxyPort(), "代理服务器端口不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getProxyUserName(), "代理服务器验证的用户名。不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getProxyPassword(), "代理服务器验证的密码。不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getUseBasicAuth(), "是否使用基本身份验证不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getSignExpired(), "多次签名的过期时间,单位秒不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getConnectionRequestTimeout(), "获取连接的超时时间, 单位ms不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getConnectionTimeout(), "默认连接超时, 单位ms不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getSocketTimeout(), "SOCKET读取超时时间, 单位ms不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getMaxConnectionsCount(), "最大HTTP连接数不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getIdleConnectionAlive(), "空闲连接存活时间不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getUserAgent(), "user_agent标识不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getReadLimit(), "读取限制不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getCiSpecialRequest(), "数据万象特殊请求配置不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getMaxErrorRetry(), "请求失败后最大的重试次数。默认3次。不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getExtraJson(), "额外json不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getStatus(), "状态不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getCreatedBy(), "创建人不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getCreatedTime(), "创建时间不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getUpdateTime(), "更新时间不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getUpdateBy(), "更新人不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getIsDeleted(), "是否删除 0 未删除 1已删除不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getOpenAdvancedSetup(), "是否开启高级设置不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getCreateBucket(), "当桶不存在，是否创建不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getCheckBucket(), "启动检测桶，是否存在不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getPartSize(), "分片大小,默认5MB不能为空");
            Preconditions.checkNotNull(schisandraOssTencentDTO.getTaskNum(), "并发线程数,默认等于CPU的核数不能为空");
            SchisandraOssTencentBO schisandraOssTencentBO = SchisandraOssTencentDTOConverter.INSTANCE.convertDTOToBO(schisandraOssTencentDTO);
            return Result.ok(schisandraOssTencentDomainService.delete(schisandraOssTencentBO));
        } catch (Exception e) {
            log.error("SchisandraOssTencentController.delete.error:{}", e.getMessage(), e);
            return Result.fail("删除腾讯云对象存储配置表信息失败");
        }

    }

}
