package cn.fateverse.query.entity.dto;

import cn.fateverse.common.core.utils.ObjectUtils;
import cn.fateverse.query.entity.Portal;
import cn.fateverse.query.entity.PortalMapping;
import cn.fateverse.query.enums.PortalEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.web.bind.annotation.RequestMethod;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.List;

/**
 * 接口管理表(portal 传送门  接口作为入口 传送到其他类型)对象 portal
 *
 * @author clay
 * @date 2024-04-15
 */
@Data
@ApiModel("接口管理表(portal 传送门  接口作为入口 传送到其他类型)Dto")
public class PortalDto {

    /**
     * 主键id
     */
    @ApiModelProperty("主键id")
    private String portalId;

    /**
     * 自定义查询id
     */
    @ApiModelProperty("自定义查询id")
    private Long queryId;

    /**
     * 数据适配器id
     */
    @ApiModelProperty("数据适配器id")
    private Long adapterId;

    /**
     * 接口名称
     */
    @ApiModelProperty("接口名称")
    @NotBlank(message = "接口名称不能为空")
    private String portalName;

    /**
     * 是否匿名
     */
    @ApiModelProperty("是否匿名")
    @NotNull(message = "是否匿名不能为空")
    private Boolean anonymity;

    /**
     * 接口类型
     */
    @ApiModelProperty("接口类型")
    @NotNull(message = "接口类型不能为空")
    private PortalEnum type;


    @ApiModelProperty("请求类型")
    @NotBlank(message = "请求类型不能为空")
    private String requestMethod;

    @NotNull(message = "是否创建数据适配器不能为空!")
    private Boolean createDataAdapter;

    /**
     * 是否分页
     */
    private Boolean page;

    /**
     * 系统暴露地址
     */
    @ApiModelProperty("系统暴露地址")
    @NotBlank(message = "系统暴露地址不能为空")
    private String path;

    /**
     * 第三方接口地址
     */
    @ApiModelProperty("第三方接口地址")
    private String url;


    /**
     * 状态
     */
    @ApiModelProperty("状态")
    private Integer state;

    /**
     * 备注
     */
    @ApiModelProperty("备注")
    private String remark;


    @ApiModelProperty("数据适配器信息")
    private DataAdapterDto dataAdapter;


    @ApiModelProperty("映射关系")
    private List<PortalMapping> mappings;


    public Portal toPortal() {
        Portal portal = Portal.builder()
                .queryId(queryId)
                .adapterId(adapterId)
                .portalName(portalName)
                .anonymity(anonymity)
                .createDataAdapter(createDataAdapter)
                .requestMethod(requestMethod)
                .page(page)
                .type(type)
                .path(path)
                .url(url)
                .state(state)
                .build();
        try {
            RequestMethod.valueOf(requestMethod);
        } catch (Exception e) {
            throw new RuntimeException("请求类型不支持!");
        }
        if (!ObjectUtils.isEmpty(portalId)) {
            portal.setPortalId(Long.valueOf(portalId));
        }
        if (!ObjectUtils.isEmpty(mappings)) {
            for (PortalMapping mapping : mappings) {
                if (!mapping.check()) {
                    throw new RuntimeException("映射关系不完全,请检查映射关系");
                }
            }
        }
        portal.setRemark(remark);
        return portal;
    }
}