package service

import "encoding/json"

type Intelligence struct {
	Source     string      `json:"source"`
	Confidence int         `json:"confidence"`
	Expired    bool        `json:"expired"`
	IntelTags  []TagsClass `json:"intel_tags"`
	FindTime   string      `json:"find_time"`
	IntelTypes []string    `json:"intel_types"`
	UpdateTime string      `json:"update_time"`
}

type OpenSource struct {
	Source     string      `json:"source"`
	Confidence int         `json:"confidence"`
	Expired    bool        `json:"expired"`
	IntelTags  []TagsClass `json:"intel_tags"`
	FindTime   string      `json:"find_time"`
	IntelTypes []string    `json:"intel_types"`
	UpdateTime string      `json:"update_time"`
}

type Location struct {
	Country     string `json:"country"`
	Province    string `json:"province"`
	City        string `json:"city"`
	Longitude   string `json:"lng"`
	Latitude    string `json:"lat"`
	CountryCode string `json:"country_code"`
}

type Basic struct {
	Carrier  string   `json:"carrier"`
	Location Location `json:"location"`
}

type ASN struct {
	Rank   int    `json:"rank"`
	Info   string `json:"info"`
	Number int    `json:"number"`
}

type Port struct {
	Port    int    `json:"port"`
	Module  string `json:"module"`
	Product string `json:"product"`
	Version string `json:"version"`
	Detail  string `json:"detail"`
}

type RDNS struct {
	RDNS    string `json:"rdns"`
	GetTime string `json:"get_time"`
}

type Intelligences struct {
	ThreatbookLab []Intelligence `json:"threatbook_lab"`
	XReward       []interface{}  `json:"x_reward"`
	OpenSource    []OpenSource   `json:"open_source"`
}

type Sample struct {
	Hash          string `json:"sha256"`
	ScanTime      string `json:"scan_time"`
	Ratio         string `json:"ratio"`
	MalwareType   string `json:"malware_type"`
	MalwareFamily string `json:"malware_family"`
}

type TagsClass struct {
	TagsType string   `json:"tags_type"` //标签类别，如"industry(行业)"、"gangs（团伙）"、"virus_family（家族）"等
	Tags     []string `json:"tags"`      //具体的攻击团伙或安全事件标签，例如：APT、海莲花等。
}

type CAS struct {
	Protocol           string      `json:"protocol"`
	Port               int16       `json:"port"`
	Period             int         `json:"period"`
	DigitalCertificate Certificate `json:"digital_certificate"`
}

type Certificate struct {
	Subject      string `json:"subject"`
	Issuer       string `json:"issuer"`
	Fingerprint  string `json:"fingerprint"`
	Purpose      string `json:"purpose"`
	Verify       string `json:"verify"`
	Status       string `json:"status"`
	Revoked      bool   `json:"revoked"`
	Begin        string `json:"begin"`
	End          string `json:"end"`
	StatusDesc   string `json:"status_desc"`
	SerialNumber string `json:"serial_number"`
	RevokedTime  string `json:"revoked_time"`
}

type IpInfo struct {
	Samples       []Sample      `json:"samples"`
	TagsClasses   []TagsClass   `json:"tags_classes"`
	Judgments     []string      `json:"judgments"`
	Intelligences Intelligences `json:"intelligences"`
	Scene         string        `json:"scene"`
	Basic         Basic         `json:"basic"`
	ASN           ASN           `json:"asn"`
	Ports         []Port        `json:"ports"`
	CAS           []CAS         `json:"cas"`
	UpdateTime    string        `json:"update_time"`
	RDNSList      []RDNS        `json:"rdns_list"`
	SumCurDomains string        `json:"sum_cur_domains"`
}

type RespData struct {
	Data         map[string]json.RawMessage `json:"data"`
	ResponseCode int                        `json:"response_code"`
	VerboseMsg   string                     `json:"verbose_msg"`
}

type Reputation struct {
	IsMalicious bool `json:"is_malicious"`
}

type ASNPrivate struct {
	Rank   int    `json:"rank"`
	Info   string `json:"info"`
	Number string `json:"number"`
}

type LocationPrivate struct {
	Country     string  `json:"country"`
	Province    string  `json:"province"`
	City        string  `json:"city"`
	Longitude   float64 `json:"lng"`
	Latitude    float64 `json:"lat"`
	CountryCode string  `json:"country_code"`
}

type BasicPrivate struct {
	Carrier  string          `json:"carrier"`
	Location LocationPrivate `json:"location"`
}

type TagsClassPrivate map[string][]string

type IPInfoPrivate struct {
	Judgments   []string         `json:"judgments"`
	Basic       BasicPrivate     `json:"basic"`
	ASN         ASNPrivate       `json:"asn"`
	Scene       string           `json:"scene"`
	IsMalicious bool             `json:"is_malicious"`
	TagsClasses TagsClassPrivate `json:"tags_classes"`
}

type IPInfoPrivateRespData struct {
	IOC          string          `json:"ioc"`
	Intelligence []IPInfoPrivate `json:"intelligence"`
}

type IPInfoPrivateResp struct {
	Data         []IPInfoPrivateRespData `json:"data"`
	ResponseCode int                     `json:"response_code"`
	VerboseMsg   string                  `json:"verbose_msg"`
}

type WafService struct {
	GatewayName string   `json:"gateway_name"`
	Mode        string   `json:"mode"`
	RuleNum     int      `json:"rule_num"`
	AttackNum   int      `json:"attack_num"`
	Listeners   []string `json:"listeners"`
} // WAF configuration details

type GatewateInfo struct {
	GatewayName   string `json:"gateway_name"`
	Namespace     string `json:"namespace"`
	RegionCode    string `json:"region_code"`
	ApiGatewayCrn string `json:"gateway_crn"`
	// Hosts         []string `json:"hosts"`
}

type GetWafGatewayInfoReq struct {
	GatewateInfo
	Cookie string `json:"cookie"`
}

type CreateWafReq struct {
	GatewateInfo
	Port         uint32   `json:"port"`
	Host         []string `json:"host"`
	Mode         WafMode  `json:"mode"`
	ListenerName string   `json:"listener_name"`
}

type DeleteWafReq struct {
	GatewateInfo
	Ports []int `json:"ports"`
}

type RuleRequest struct {
	GatewateInfo
	CategoryID []string `json:"category_id"`
	Status     int      `json:"status"`
}

type WafMode string

const (
	WafModeProtect     WafMode = "protect"
	WafModeAlert       WafMode = "alert"
	WafModePassthrough WafMode = "passthrough"
)

type UpdateModeReq struct {
	Mode        WafMode `json:"mode"`
	GatewayName string  `json:"gateway_name"`
	Namespace   string  `json:"namespace"`
	RegionCode  string  `json:"region_code"`
}

type EnableListenerWafReq struct {
	GatewateInfo
	Enable       bool     `json:"enable"`
	Hosts        []string `json:"hosts"`
	Port         int      `json:"port"`
	Mode         WafMode  `json:"mode"`
	ListenerName string   `json:"listener_name"`
}

type EnableGatewayWafReq struct {
	GatewateInfo
	Enable bool   `json:"enable"`
	Cookie string `json:"cookie"`
}

type ListenerWaf struct {
	Hosts []string `json:"hosts"`
	// Port         int      `json:"port"`
	HostsAndPort string `json:"hosts_and_port"`
	Name         string `json:"name"`
}

type EnableListenerWafsReq struct {
	GatewateInfo
	Enable    bool          `json:"enable"`
	Listeners []ListenerWaf `json:"listeners"`
}

type WafRule struct {
	ID          int    `json:"id"`
	Level       int    `json:"level"`
	Name        string `json:"name"`
	Type        string `json:"type"`
	Description string `json:"description"`
	Expr        string `json:"expr"`
	Mode        string `json:"mode"`
}

type Catagory struct {
	EN string `json:"en"`
	Zh string `json:"zh"`
}

type Description struct {
	EN string `json:"en"`
	Zh string `json:"zh"`
}

type WafRuleCategory struct {
	CategoryID  string      `json:"category_id"`
	Status      int         `json:"status,omitempty"`
	Catagory    Catagory    `json:"catagory"`
	Description Description `json:"description"`
	Rules       []WafRule   `json:"rules"`
}

type GatewayListener struct {
	GatewayName string   `json:"gateway_name"`
	Namespace   string   `json:"namespace"`
	RegionCode  string   `json:"region_code"`
	Hosts       []string `json:"hosts"`
	Port        int      `json:"port"`
	Enable      bool     `json:"enable"`
}

type CreateListenerReq struct {
	GatewateInfo
	Port int `json:"port"`
}

type DeleteListenerReq struct {
	GatewateInfo
	Port int `json:"port"`
}

type GatewayRespListenerData struct {
	GatewayName       string   `json:"gateway_name"`
	Namespace         string   `json:"namespace"`
	ListenerName      string   `json:"listener_name"`
	ApiGatewayCrn     string   `json:"apigateway_crn"`
	CreateAccountName string   `json:"create_account_name"`
	CreateAccountID   string   `json:"create_account_id"`
	Hosts             []string `json:"hosts"`
	Port              int      `json:"port"`
}

type GatewayResponseBase struct {
	Code    string `json:"code"`
	Message string `json:"message"`
}

type GatewayListenerResponse struct {
	GatewayResponseBase
	Data GatewayRespListenerData `json:"data"`
}

type GatewayListenerResponseList struct {
	GatewayResponseBase
	Data []GatewayRespListenerData `json:"data"`
}
