package dto

import (
	"database/sql"
	"time"
)

type TopResult struct {
	ClusterIds             []string `json:"ClusterIds"`
	Alias                  string   `json:"Alias"`
	AVGMemMax              float64  `json:"AVGMemMax"`
	AVGQueryTime           float64  `json:"AVGQueryTime"`
	Digest                 string   `json:"Digest"`
	Query                  string   `json:"Query,omitempty"`
	Link                   string   `json:"Link"`
	MAXMem                 int      `json:"MAXMem"`
	MAXQueryTime           float64  `json:"MAXQueryTime"`
	TotalCount             int      `json:"TotalCount"`
	ConnID                 string   `json:"ConnID,omitempty"`
	FormattedTimestamp     string   `json:"FormattedTimestamp,omitempty"`
	QueryLink              string   `json:"QueryLink"`
	TopSqlLink             string   `json:"TopSqlLink"`
	IsNewDigest            bool     `json:"IsNewDigest"`
	MaxCPUTimeIn5MinWindow float64  `json:"MaxCPUTimeIn5MinWindow"`
	MaxValueTimestamp      string   `json:"MaxValueTimestamp"`
	Instance               string   `json:"Instance"`
	TotalCPUTimeInDay      float64  `json:"TotalCPUTimeInDay"`
	// AVGRequestUnitRead     sql.NullFloat64 `json:"AVGRequestUnitRead"`
	// SUMRequestUnitRead     sql.NullFloat64 `json:"SUMRequestUnitRead"`
	// AVGRequestUnitWrite    sql.NullFloat64 `json:"AVGRequestUnitWrite"`
	// SUMRequestUnitWrite    sql.NullFloat64 `json:"SUMRequestUnitWrite"`
	SumRU sql.NullFloat64 `json:"SumRU"`
	AvgRU sql.NullFloat64 `json:"AvgRU"`
}

type DigestDetailResult struct {
	Query              string  `json:"Query"`
	Digest             string  `json:"Digest"`
	BinaryPlanParsed   string  `json:"Binary_plan_parsed"`
	DB                 string  `json:"DB"`
	FormattedTimestamp string  `json:"Formatted_Timestamp"`
	IndexNames         string  `json:"Index_names"`
	MemMax             int     `json:"Mem_max"`
	QueryTime          float64 `json:"Query_time"`
	RequestCount       int     `json:"Request_count"`
	Stats              string  `json:"Stats"`
	Warnings           string  `json:"Warnings"`
	ConnID             int     `json:"Conn_ID"`
	DB2                string  `json:"DB2"`
	Link               string  `json:"Link"`
}

type QueryResult struct {
	QueryName  string        `json:"slow_query_pattern"`
	Level      string        `json:"level"`
	TotalCount PatternResult `json:"count_result"`
	Top10      []TopResult   `json:"top_10"`
}

type Summary struct {
	Day     string `json:"day"`
	OrgID   string `json:"org_id"`
	OrgName string `json:"org_name"`
	// PatternCountResult map[string]PatternCountResult   `json:"pattern_count_result"`
	TotalSlowQueries int            `json:"total_slow_queries"`
	TotalPatterns    int            `json:"total_patterns"`
	UniqueDigests    int            `json:"unique_digests"`
	NewDigests       map[string]int `json:"new_digests"`
	CriticalCount    int            `json:"critical_count"`
	MajorCount       int            `json:"major_count"`
	CriticalDetails  map[string]int `json:"critical_details"`
	MajorDetails     map[string]int `json:"major_details"`
}

type FinalOutput struct {
	Summary      Summary       `json:"summary"`
	QueryResults []QueryResult `json:"results"`
	DocLink      string        `json:"doc_link"`
}

// Cluster Cluster information
type Cluster struct {
	ClusterID       string `yaml:"clusterId" json:"clusterId"`
	ClusterName     string `yaml:"clusterName" json:"clusterName"`
	Alias           string `yaml:"alias" json:"alias"`
	ProjectId       string `yaml:"projectId" json:"projectId"`
	Region          string `yaml:"region" json:"region"`
	Provider        string `yaml:"provider" json:"provider"`
	MetricsRouting  string `yaml:"metricsRouting" json:"metricsRouting"`
	DeployType      string `yaml:"deployType" json:"deployType"`
	SkipCheck       bool   `yaml:"skipCheck" json:"skipCheck"`
	ApplicationId   string `yaml:"applicationId" json:"applicationId"`
	PhysicClusterId string `yaml:"physicClusterId" json:"physicClusterId"`
	DataplaneId     string `yaml:"dataplaneId" json:"dataplaneId"`
}

// Org Organization configuration
type Org struct {
	OrgName      string    `yaml:"orgName" json:"orgName"`
	OrgID        string    `yaml:"orgId" json:"orgId"`
	VarOrgID     string    `yaml:"varOrgId" json:"varOrgId"`
	ReceiveID    []string  `yaml:"receiveID" json:"receiveID"`
	DocumentUrl  string    `yaml:"documentUrl" json:"documentUrl"`
	DocumentId   string    `yaml:"documentId" json:"documentId"`
	TopSqlDoc    TopSqlDoc `yaml:"topSqlDoc" json:"topSqlDoc"`
	AfterBlockId string    `yaml:"afterBlockId" json:"afterBlockId"`
	Clusters     []Cluster `yaml:"clusters" json:"cluster"`
}

type TopSqlDoc struct {
	DocUrl string `yaml:"docUrl" json:"docUrl"`
	DocId  string `yaml:"docId" json:"docId"`
}

// Orgs Organization configuration list
type Orgs struct {
	Orgs []Org `yaml:"orgs" json:"orgs"`
}

type PatternResult struct {
	CountGE10 int `gorm:"column:count_ge_10"` // Number of Digests with occurrences >= 10
	// CountLT10            int    `gorm:"column:count_lt_10"`            // Number of Digests with occurrences < 10
	// TotalOccurrences     int    `gorm:"column:total_occurrences"`      // Total occurrences
	TotalDistinctDigests int         `gorm:"column:total_distinct_digests"` // Total number of distinct Digests
	PatternName          string      `gorm:"-"`                             // This field will not map to database fields
	Level                string      `gorm:"-"`                             // This field will not map to database fields
	TopResult            []TopResult `gorm:"-"`                             // This field will not map to database fields
}

type TimeRange struct {
	Start time.Time `json:"start"`
	End   time.Time `json:"end"`
}
