package com.sf.service.gateway.domain;

import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.sf.common.annotation.Excel;
import com.sf.common.core.domain.BaseEntity;
import org.hibernate.validator.constraints.URL;

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

/**
 * 路由管理对象 Gateway_route
 * 
 * @author 邹坤
 * @date 2024-04-22
 */
@Data
@EqualsAndHashCode(callSuper = false)
public class GatewayRoute extends BaseEntity
{
    private static final long serialVersionUID = 1L;

    /** ID */
    private Long id;

    /** 路由名称 */
    @Excel(name = "路由名称")
    @NotBlank(message = "路由名称不能为空")
    private String routeName;

    /** 请求协议，目前只支持HTTP */
    @Excel(name = "请求协议")
    @NotBlank(message = "请求协议不能为空")
    private String requestProtocol;

    /** 路由类型（WEIGHT_ROUTE=权重路由，HEADER_ROUTE=请求头路由） */
    @Excel(name = "路由类型")
    @NotBlank(message = "路由类型不能为空")
    private String routeType;

    /** 路由配置信息，json数组格式*/
    @Excel(name = "路由配置信息，json数组格式")
    @NotBlank(message = "路由配置信息不能为空")
    private String routeContent;

    /** 路由状态探活（0停用 1启用） */
    @Excel(name = "路由状态探活（0停用 1启用）")
    private String routeStatusActiveMonitoring;

    /** 路由探活路径 */
    @Excel(name = "路由探活路径")
    private String routeActiveMonitoringPath;

    /** 路由探活超时时间，单位ms */
    @Excel(name = "路由探活超时时间，单位ms")
    private Long routeActiveMonitoringTimeout;

    @ApiModelProperty("创建者")
    private String created;

    @ApiModelProperty("更新者")
    private String modified;

    @ApiModelProperty("应用编号")
    private String appCode;

    @ApiModelProperty("路由活跃状态（0=探活未开启，1=状态获取中，2=正常，3=异常）")
    private String routeActiveStatus;

    @Data
    public static class RouteContent{

        /**
         * 权重模式使用：
         * 权重值，总值100，不能为负数
         */
        private Integer weight;

        /**
         * HEADER模式使用：
         * 请求头键值
         */
        private String headerKey;

        /**
         * HEADER模式使用：
         * 请求头value集合
         */
        private List<String> headerValues;

        /**
         * HEADER模式使用：
         * 请求头值匹配类型（EQ,IN）
         */
        private String matchType;

        /**
         * 服务地址
         */
        private String serverAddress;
    }

}
