package com.bocloud.nms.model.hillstone;

import java.util.Arrays;
import java.util.Objects;

// 关联关系
public class RelationModel extends HillStoneGenericModel {
    private Long srcId; // 源id
    private String srcValue; // 源值
    private Long dstId; // 目标id
    private String dstValue; // 目标值
    /**
     * 关联类型
     *
     * @see Type
     */
    private Integer type; // 关联类型
    private String dataType; // 数据类型 0 单体 1 组

    public RelationModel() {
    }

    public RelationModel(String srcValue, String dstValue, Integer type) {
        this.srcValue = srcValue;
        this.dstValue = dstValue;
        this.type = type;
    }

    public RelationModel(String srcValue, String dstValue, Integer type, String dataType) {
        this.srcValue = srcValue;
        this.dstValue = dstValue;
        this.type = type;
        this.dataType = dataType;
    }

    public Long getSrcId() {
        return srcId;
    }

    public void setSrcId(Long srcId) {
        this.srcId = srcId;
    }

    public String getSrcValue() {
        return srcValue;
    }

    public void setSrcValue(String srcValue) {
        this.srcValue = srcValue;
    }

    public Long getDstId() {
        return dstId;
    }

    public void setDstId(Long dstId) {
        this.dstId = dstId;
    }

    public String getDstValue() {
        return dstValue;
    }

    public void setDstValue(String dstValue) {
        this.dstValue = dstValue;
    }

    public Integer getType() {
        return type;
    }

    public void setType(Integer type) {
        this.type = type;
    }

    public String getDataType() {
        return dataType;
    }

    public void setDataType(String dataType) {
        this.dataType = dataType;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        RelationModel relation = (RelationModel) o;
        return Objects.equals(srcId, relation.srcId) &&
            Objects.equals(dstId, relation.dstId) &&
            Objects.equals(type, relation.type);
    }

    @Override
    public int hashCode() {
        return Objects.hash(srcId, dstId, type);
    }

    public enum Type {
        ADDRESS_BOOK__ADDRESS_BOOK(100101), //地址本-->子地址本
        ADDRESS_BOOK__COUNTRY_BOOK(100102), //地址本-->国家地区本
        POLICY_ROUTE_RULE__SRC_ADDRESS_BOOK(100201), //策略路由规则-->源地址本
        POLICY_ROUTE_RULE__SRC_USER_GROUP(100202), //策略路由规则-->源用户组
        POLICY_ROUTE_RULE__SRC_USER(100203), //策略路由规则-->源用户
        POLICY_ROUTE_RULE__DST_ADDRESS_BOOK(100204), //策略路由规则-->目的地址本
        POLICY_ROUTE_RULE__SERVICE_BOOK(100205), //策略路由规则-->服务
        POLICY_ROUTE_RULE__SERVICE_GROUP(100208), //策略路由规则-->服务组
        POLICY_ROUTE_RULE__APP_BOOK(100206), //策略路由规则-->应用
        POLICY_ROUTE_RULE__APP_GROUP(100209), //策略路由规则-->应用组
        POLICY_ROUTE_RULE__TIME_BOOK(100207), //策略路由规则-->时间表
        SECURITY_POLICY__SRC_ADDRESS_BOOK(100301), //安全策略-->源地址本
        SECURITY_POLICY__DST_ADDRESS_BOOK(100302), //安全策略-->目的地址本
        SECURITY_POLICY__SERVICE_BOOK(100303), //安全策略-->服务
        SECURITY_POLICY__SERVICE_GROUP(100304), //安全策略-->服务组
        SECURITY_POLICY__APP_BOOK(100305), //安全策略-->应用
        SECURITY_POLICY__APP_GROUP(100306), //安全策略-->应用组
        SECURITY_POLICY__APP_FILTER_GROUP(100307), //安全策略-->应用过滤组
        SECURITY_POLICY__SERVICE_ALL(100398), //安全策略-->服务or服务组
        SERVICE_GROUP__SERVICE_BOOK(100401), //服务组-->服务
        SERVICE_GROUP__SERVICE_GROUP(100402), //服务组-->子服务组
        VIRTUAL_ROUTE_RIP__INTERFACE(100501), //RIP-->被动接口
        APPLICATION_GROUP__APPLICATION(100601), //应用组-->应用
        APPLICATION_GROUP__APPLICATION_GROUP(100602), //应用组-->应用组
        STATIC_FEATURE_RULE__SRC_ADDRESS_BOOK(100603), //静态特征规则-->源地址
        STATIC_FEATURE_RULE__DST_ADDRESS_BOOK(100604), //静态特征规则-->目的地址
        ;
        private final int value;

        Type(int value) {
            this.value = value;
        }

        public int getValue() {
            return value;
        }

        public static Type byValue(int value) {
            return Arrays.stream(Type.values()).filter(type -> type.getValue() == value).findFirst().orElse(null);
        }
    }
}
