package com.schisandra.oss.application.controller;

import com.alibaba.fastjson.JSON;
import com.google.common.base.Preconditions;

import com.schisandra.oss.application.convert.SchisandraOssAliDTOConverter;
import com.schisandra.oss.application.dto.SchisandraOssAliDTO;
import com.schisandra.oss.application.oss.core.ali.AliOssConfiguration;
import com.schisandra.oss.common.entity.Result;
import com.schisandra.oss.domain.bo.SchisandraOssAliBO;
import com.schisandra.oss.domain.service.SchisandraOssAliDomainService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;

/**
 *  controller
 *
 * @author landaiqing
 * @since 2024-05-14 20:45:32
 */
@RestController
@RequestMapping("/oss/ali/")
@Slf4j
public class SchisandraOssAliController {

    @Resource
    private SchisandraOssAliDomainService schisandraOssAliDomainService;
    @Resource
    private AliOssConfiguration aliOssConfiguration;

    @GetMapping("init")
    public void init(@RequestParam String userId){
        if (log.isInfoEnabled()) {
            log.info("SchisandraOssAliController.init.userId:{}", userId);
        }
        Preconditions.checkNotNull(userId, "用户id不能为空！");
        try {
            aliOssConfiguration.aliOssClient(userId);
            log.info("用户: " + userId + "-> ali oss 初始化完成！");
        } catch (Exception e) {
            log.error("用户: " + userId + "-> ali oss 初始化失败！", e.getMessage(), e);
        }
    }

    /**
     * 新增
     */
    @RequestMapping("add")
    public Result<Boolean> add(@RequestBody SchisandraOssAliDTO schisandraOssAliDTO) {

        try {
            if (log.isInfoEnabled()) {
                log.info("SchisandraOssAliController.add.dto:{}", JSON.toJSONString(schisandraOssAliDTO));
            }
            parameterCheck(schisandraOssAliDTO);
            SchisandraOssAliBO SchisandraOssAliBO = SchisandraOssAliDTOConverter.INSTANCE.convertDTOToBO(schisandraOssAliDTO);
            return Result.ok(schisandraOssAliDomainService.add(SchisandraOssAliBO));
        } catch (Exception e) {
            log.error("SchisandraOssAliController.register.error:{}", e.getMessage(), e);
            return Result.fail("新增失败");
        }

    }



    /**
     * 修改
     */
    @RequestMapping("update")
    public Result<Boolean> update(@RequestBody SchisandraOssAliDTO schisandraOssAliDTO) {

        try {
            if (log.isInfoEnabled()) {
                log.info("SchisandraOssAliController.update.dto:{}", JSON.toJSONString(schisandraOssAliDTO));
            }
            parameterCheck(schisandraOssAliDTO);
            SchisandraOssAliBO schisandraOssAliBO = SchisandraOssAliDTOConverter.INSTANCE.convertDTOToBO(schisandraOssAliDTO);
            return Result.ok(schisandraOssAliDomainService.update(schisandraOssAliBO));
        } catch (Exception e) {
            log.error("SchisandraOssAliController.update.error:{}", e.getMessage(), e);
            return Result.fail("更新信息失败");
        }

    }

    /**
     * 删除
     */
    @RequestMapping("delete")
    public Result<Boolean> delete(@RequestBody SchisandraOssAliDTO schisandraOssAliDTO) {

        try {
            if (log.isInfoEnabled()) {
                log.info("SchisandraOssAliController.delete.dto:{}", JSON.toJSONString(schisandraOssAliDTO));
            }
            parameterCheck(schisandraOssAliDTO);
            SchisandraOssAliBO schisandraOssAliBO = SchisandraOssAliDTOConverter.INSTANCE.convertDTOToBO(schisandraOssAliDTO);
            return Result.ok(schisandraOssAliDomainService.delete(schisandraOssAliBO));
        } catch (Exception e) {
            log.error("SchisandraOssAliController.delete.error:{}", e.getMessage(), e);
            return Result.fail("删除信息失败");
        }

    }

    private void parameterCheck(SchisandraOssAliDTO schisandraOssAliDTO) {
        Preconditions.checkNotNull(schisandraOssAliDTO.getId(), "不能为空");
        Preconditions.checkNotNull(schisandraOssAliDTO.getUserId(), "不能为空");
        Preconditions.checkNotNull(schisandraOssAliDTO.getEndpoint(), "OSS地址不能为空");
        Preconditions.checkNotNull(schisandraOssAliDTO.getAccessKeyId(), "AccessKey ID不能为空");
        Preconditions.checkNotNull(schisandraOssAliDTO.getAccessKeySecret(), "AccessKey Secret不能为空");
        Preconditions.checkNotNull(schisandraOssAliDTO.getSecurityToken(), "security Token不能为空");
        Preconditions.checkNotNull(schisandraOssAliDTO.getBucketName(), "Bucket名称不能为空");
        Preconditions.checkNotNull(schisandraOssAliDTO.getBasePath(), "数据存储路径不能为空");
        Preconditions.checkNotNull(schisandraOssAliDTO.getUserAgent(), "用户代理，指HTTP的User-Agent头。默认为aliyun-sdk-java。不能为空");
        Preconditions.checkNotNull(schisandraOssAliDTO.getMaxErrorRetry(), "请求失败后最大的重试次数。默认3次。不能为空");
        Preconditions.checkNotNull(schisandraOssAliDTO.getConnectionRequestTimeout(), "从连接池中获取连接的超时时间（单位：毫秒）。默认不超时。不能为空");
        Preconditions.checkNotNull(schisandraOssAliDTO.getConnectionTimeout(), "建立连接的超时时间（单位：毫秒）。默认为50000毫秒。不能为空");
        Preconditions.checkNotNull(schisandraOssAliDTO.getSocketTimeout(), "Socket层传输数据的超时时间（单位：毫秒）。默认为50000毫秒。不能为空");
        Preconditions.checkNotNull(schisandraOssAliDTO.getMaxConnections(), "允许打开的最大HTTP连接数。默认为1024不能为空");
        Preconditions.checkNotNull(schisandraOssAliDTO.getConnectionTTL(), "连接TTL (生存时间)。Http连接由连接管理器用TTL缓存。不能为空");
        Preconditions.checkNotNull(schisandraOssAliDTO.getUseReaper(), "是否使用com.aliyun.oss.common.comm.IdleConnectionReaper管理过期连接,默认开启不能为空");
        Preconditions.checkNotNull(schisandraOssAliDTO.getIdleConnectionTime(), "连接空闲超时时间，超时则关闭连接（单位：毫秒）。默认为60000毫秒。不能为空");
        Preconditions.checkNotNull(schisandraOssAliDTO.getProtocol(), "连接OSS所采用的协议（HTTP或HTTPS），默认为HTTP。不能为空");
        Preconditions.checkNotNull(schisandraOssAliDTO.getProxyHost(), "代理服务器主机地址。不能为空");
        Preconditions.checkNotNull(schisandraOssAliDTO.getProxyPort(), "代理服务器端口。不能为空");
        Preconditions.checkNotNull(schisandraOssAliDTO.getProxyUsername(), "代理服务器验证的用户名。不能为空");
        Preconditions.checkNotNull(schisandraOssAliDTO.getProxyPassword(), "代理服务器验证的密码。不能为空");
        Preconditions.checkNotNull(schisandraOssAliDTO.getProxyDomain(), "代理服务器的域，该域可以执行NTLM认证不能为空");
        Preconditions.checkNotNull(schisandraOssAliDTO.getProxyWorkstation(), "代理主机的NTLM身份验证服务器不能为空");
        Preconditions.checkNotNull(schisandraOssAliDTO.getSupportCname(), "是否支持CNAME作为Endpoint，默认支持CNAME。不能为空");
        Preconditions.checkNotNull(schisandraOssAliDTO.getCnameExcludeList(), "设置不可变排除的CName列表 ---- 任何以该列表中的项目结尾的域都不会进行Cname解析。不能为空");
        Preconditions.checkNotNull(schisandraOssAliDTO.getSldEnabled(), "是否开启二级域名（Second Level Domain）的访问方式，默认不开启。不能为空");
        Preconditions.checkNotNull(schisandraOssAliDTO.getRequestTimeout(), "请求超时时间，单位：毫秒。默认情况下是5分钟。不能为空");
        Preconditions.checkNotNull(schisandraOssAliDTO.getRequestTimeoutEnabled(), "是否启用请求超时校验。默认情况下，它是禁用的。不能为空");
        Preconditions.checkNotNull(schisandraOssAliDTO.getSlowRequestsThreshold(), "设置慢请求的延迟阈值。如果请求的延迟大于延迟，则将记录该请求。默认情况下，阈值为5分钟。不能为空");
        Preconditions.checkNotNull(schisandraOssAliDTO.getDefaultHeaders(), "设置默认的http头。所有请求头将自动添加到每个请求中。如果在请求中也指定了相同的请求头，则默认的标头将被覆盖。不能为空");
        Preconditions.checkNotNull(schisandraOssAliDTO.getCrcCheckEnabled(), "是否在上传和下载时启用CRC校验，默认启用不能为空");
        Preconditions.checkNotNull(schisandraOssAliDTO.getSignatureVersion(), "所有请求设置签名版本不能为空");
        Preconditions.checkNotNull(schisandraOssAliDTO.getTickOffset(), "设置OSS服务端时间和本地时间之间的差异，以毫秒为单位。不能为空");
        Preconditions.checkNotNull(schisandraOssAliDTO.getRedirectEnable(), "是否开启HTTP重定向。 说明: Java SDK 3.10.1及以上版本支持设置是否开启HTTP重定向，默认开启。不能为空");
        Preconditions.checkNotNull(schisandraOssAliDTO.getVerifySSLEnable(), "是否开启SSL证书校验。 * 说明: Java SDK 3.10.1及以上版本支持设置是否开启SSL证书校验，默认开启。不能为空");
        Preconditions.checkNotNull(schisandraOssAliDTO.getLogConnectionPoolStats(), "是否开启日志记录连接池统计信息不能为空");
        Preconditions.checkNotNull(schisandraOssAliDTO.getUseSystemPropertyValues(), "是否使用系统属性值不能为空");
        Preconditions.checkNotNull(schisandraOssAliDTO.getPartSize(), "分片大小,默认5MB不能为空");
        Preconditions.checkNotNull(schisandraOssAliDTO.getTaskNum(), "并发线程数,默认等于CPU的核数不能为空");
        Preconditions.checkNotNull(schisandraOssAliDTO.getStatus(), "状态不能为空");
        Preconditions.checkNotNull(schisandraOssAliDTO.getOpenAdvancedSetup(), "是否开启高级设置不能为空");
        Preconditions.checkNotNull(schisandraOssAliDTO.getCreatedBy(), "创建人不能为空");
        Preconditions.checkNotNull(schisandraOssAliDTO.getCreatedTime(), "创建时间不能为空");
        Preconditions.checkNotNull(schisandraOssAliDTO.getUpdateTime(), "更新时间不能为空");
        Preconditions.checkNotNull(schisandraOssAliDTO.getUpdateBy(), "更新人不能为空");
        Preconditions.checkNotNull(schisandraOssAliDTO.getIsDeleted(), "是否删除 0 未删除 1已删除不能为空");
        Preconditions.checkNotNull(schisandraOssAliDTO.getExtraJson(), "额外字段不能为空");
        Preconditions.checkNotNull(schisandraOssAliDTO.getCreateBucket(), "当桶不存在，是否创建不能为空");
        Preconditions.checkNotNull(schisandraOssAliDTO.getCheckBucket(), "启动检测桶，是否存在不能为空");
    }

}
