package compute_engine

// Report structs.
type (
	HealthArgs struct {
		ClusterID string   `json:"cluster"`
		StartTS   uint     `json:"start_ts"`
		StopTS    uint     `json:"stop_ts"`
		OrgID     string   `json:"org_id"`
		OrgType   string   `json:"org_type"`
		Packages  []string `json:"packages"`
		Index     string   `json:"index"`
	}

	Report struct {
		ReportUUId     string            `json:"id"`
		Name           string            `json:"name"`
		Hook           string            `json:"hook"`
		Status         string            `json:"status"`
		Tags           map[string]any    `json:"tags"`
		HealReportArgs *HealthReportArgs `json:"args"`
		Data           *HealthDataResult `json:"data"`
		CreatedAt      uint              `json:"created_at"`
		UpdatedAt      uint              `json:"updated_at"`
	}

	HealthReportArgs struct {
		Cluster string `json:"cluster"`
		StartTs uint   `json:"start_ts"`
		StopTs  uint   `json:"stop_ts"`
	}
	HealthDataResult struct {
		Metric *HealthMetricResult `json:"metric"`
		Log    *HealthLogResult    `json:"log"`
	}

	HealthMetricResult struct {
		Advice    []HealthMetricAdvice `json:"advice"`
		Stats     *HealthMetricStats   `json:"stats"`
		Source    string               `json:"source"`
		Timestamp uint                 `json:"timestamp"`
	}

	HealthMetricAdvice struct {
		ID        int      `json:"id"`
		Name      string   `json:"name"`
		Category  []string `json:"category"`
		Component string   `json:"component"`
		Qualified bool     `json:"qualified"`
		Level     string   `json:"level"`
		Type      string   `json:"type"`
		Kb        string   `json:"kb"`
		Instance  string   `json:"instance"`
		Content   struct {
			Key       string         `json:"key"`
			Variables map[string]any `json:"variables"`
		} `json:"content"`
	}

	HealthMetricStats struct {
		CheckedRules   uint `json:"checkedRules"`
		ScannedMetrics uint `json:"scannedMetrics"`
	}

	HealthLogResult struct {
		Advice    []HealthLogAdvice `json:"advice"`
		Stats     *HealthLogStats   `json:"stats"`
		Source    string            `json:"source"`
		Timestamp uint              `json:"timestamp"`
	}

	HealthLogAdvice struct {
		ID         int      `json:"id"`
		Name       string   `json:"name"`
		Category   []string `json:"category"`
		Component  string   `json:"component"`
		Level      string   `json:"level"`
		Type       string   `json:"type"`
		Kb         string   `json:"kb"`
		Instance   string   `json:"instance"`
		Count      uint     `json:"count"`
		Conditions []string `json:"conditions"`
		Content    struct {
			Key       string         `json:"key"`
			Variables map[string]any `json:"variables"`
		} `json:"content"`
	}

	HealthLogStats struct {
		ScannedLogs uint `json:"scannedLogs"`
	}

	ComparisonReport struct {
		ReportUUID string         `json:"id"`
		Name       string         `json:"name"`
		Hook       string         `json:"hook"`
		Status     string         `json:"status"`
		Tags       map[string]any `json:"tags"`

		ComparisonReportArgs *ComparisonReportArgs `json:"args"`
		ComparisonReportData *ComparisonReportData `json:"data"`

		CreatedAt int `json:"created_at"`
		UpdatedAt int `json:"updated_at"`
	}

	ComparisonReportArgs struct {
		ClusterID  string   `json:"cluster"`
		OrgID      string   `json:"org_id"`
		OrgType    string   `json:"org_type"`
		PackageID1 []string `json:"package_id_1"`
		PackageID2 []string `json:"package_id_2"`
		StartTime1 uint     `json:"start_ts_1"`
		StartTime2 uint     `json:"start_ts_2"`
		EndTime1   uint     `json:"stop_ts_1"`
		EndTime2   uint     `json:"stop_ts_2"`
	}

	ComparisonReportData struct {
		ErrorMessage              string `json:"errorMessage,omitempty"`
		BusinessMetricsComparison []struct {
			SubValues []struct {
				SubValues any `json:"subValues"`
				Values    struct {
					Components  string `json:"components"`
					Description struct {
						Key       string `json:"key"`
						Variables any    `json:"variables"`
					} `json:"description"`
					Diff            float64 `json:"diff"`
					GrafanaLocation string  `json:"grafanaLocation"`
					Label           string  `json:"label"`
					Metrics         string  `json:"metrics"`
					T1AverageValue  string  `json:"t1AverageValue"`
					T2AverageValue  string  `json:"t2AverageValue"`
				} `json:"values"`
			} `json:"subValues"`
			Values struct {
				Components  string `json:"components"`
				Description struct {
					Key       string `json:"key"`
					Variables any    `json:"variables"`
				} `json:"description"`
				Diff            float64 `json:"diff"`
				GrafanaLocation string  `json:"grafanaLocation"`
				Label           string  `json:"label"`
				Metrics         string  `json:"metrics"`
				T1AverageValue  string  `json:"t1AverageValue"`
				T2AverageValue  string  `json:"t2AverageValue"`
			} `json:"values"`
		} `json:"businessMetricsComparison"`
		ComparisonTimeRange []struct {
			SubValues any `json:"subValues"`
			Values    struct {
				T1EndTime   int `json:"t1EndTime"`
				T1StartTime int `json:"t1StartTime"`
				T2EndTime   int `json:"t2EndTime"`
				T2StartTime int `json:"t2StartTime"`
			} `json:"values"`
		} `json:"comparisonTimeRange"`
		KeyMetricsComparison []struct {
			SubValues []struct {
				SubValues any `json:"subValues"`
				Values    struct {
					Components  string `json:"components"`
					Description struct {
						Key       string `json:"key"`
						Variables any    `json:"variables"`
					} `json:"description"`
					Diff            float64 `json:"diff"`
					GrafanaLocation string  `json:"grafanaLocation"`
					Label           string  `json:"label"`
					Metrics         string  `json:"metrics"`
					T1AverageValue  string  `json:"t1AverageValue"`
					T2AverageValue  string  `json:"t2AverageValue"`
				} `json:"values"`
			} `json:"subValues"`
			Values struct {
				Components  string `json:"components"`
				Description struct {
					Key       string `json:"key"`
					Variables any    `json:"variables"`
				} `json:"description"`
				Diff            float64 `json:"diff"`
				GrafanaLocation string  `json:"grafanaLocation"`
				Label           string  `json:"label"`
				Metrics         string  `json:"metrics"`
				T1AverageValue  string  `json:"t1AverageValue"`
				T2AverageValue  string  `json:"t2AverageValue"`
			} `json:"values"`
		} `json:"keyMetricsComparison"`
		LogComparison []struct {
			SubValues any `json:"subValues"`
			Values    struct {
				Diff         int64  `json:"diff"`
				Name         string `json:"name"`
				T1Percentage string `json:"t1Percentage"`
				T2Percentage string `json:"t2Percentage"`
			} `json:"values"`
		} `json:"logComparison"`
		PerformanceMetricsComparison struct {
			PerfBasic []struct {
				SubValues any `json:"subValues"`
				Values    struct {
					Components  string `json:"components"`
					Description struct {
						Key       string `json:"key"`
						Variables any    `json:"variables"`
					} `json:"description"`
					Diff            any    `json:"diff"`
					GrafanaLocation string `json:"grafanaLocation"`
					Label           string `json:"label"`
					Metrics         string `json:"metrics"`
					T1AverageValue  any    `json:"t1AverageValue"`
					T2AverageValue  any    `json:"t2AverageValue"`
				} `json:"values"`
			} `json:"Perf_basic"`
			PerfDetailed []struct {
				SubValues any `json:"subValues"`
				Values    struct {
					Components  string `json:"components"`
					Description struct {
						Key       string `json:"key"`
						Variables any    `json:"variables"`
					} `json:"description"`
					Diff            float64 `json:"diff"`
					GrafanaLocation string  `json:"grafanaLocation"`
					Label           string  `json:"label"`
					Metrics         string  `json:"metrics"`
					T1AverageValue  string  `json:"t1AverageValue"`
					T2AverageValue  string  `json:"t2AverageValue"`
				} `json:"values"`
			} `json:"Perf_detailed"`
			PerfDurby []struct {
				SubValues any `json:"subValues"`
				Values    struct {
					Components  string `json:"components"`
					Description struct {
						Key       string `json:"key"`
						Variables any    `json:"variables"`
					} `json:"description"`
					Diff            float64 `json:"diff"`
					GrafanaLocation string  `json:"grafanaLocation"`
					Label           string  `json:"label"`
					Metrics         string  `json:"metrics"`
					T1AverageValue  string  `json:"t1AverageValue"`
					T2AverageValue  string  `json:"t2AverageValue"`
				} `json:"values"`
			} `json:"Perf_durbytype"`
			PerfKvrequest []struct {
				SubValues any `json:"subValues"`
				Values    struct {
					Components  string `json:"components"`
					Description struct {
						Key       string `json:"key"`
						Variables any    `json:"variables"`
					} `json:"description"`
					Diff            any    `json:"diff"`
					GrafanaLocation string `json:"grafanaLocation"`
					Label           string `json:"label"`
					Metrics         string `json:"metrics"`
					T1AverageValue  any    `json:"t1AverageValue"`
					T2AverageValue  any    `json:"t2AverageValue"`
				} `json:"values"`
			} `json:"Perf_kvrequest"`
			PerfPhase []struct {
				SubValues any `json:"subValues"`
				Values    struct {
					Components  string `json:"components"`
					Description struct {
						Key       string `json:"key"`
						Variables any    `json:"variables"`
					} `json:"description"`
					Diff            float64 `json:"diff"`
					GrafanaLocation string  `json:"grafanaLocation"`
					Label           string  `json:"label"`
					Metrics         string  `json:"metrics"`
					T1AverageValue  string  `json:"t1AverageValue"`
					T2AverageValue  string  `json:"t2AverageValue"`
				} `json:"values"`
			} `json:"Perf_phase"`
			PerfSqlexecute []struct {
				SubValues any `json:"subValues"`
				Values    struct {
					Components  string `json:"components"`
					Description struct {
						Key       any `json:"key"`
						Variables any `json:"variables"`
					} `json:"description"`
					Diff            float64 `json:"diff"`
					GrafanaLocation string  `json:"grafanaLocation"`
					Label           string  `json:"label"`
					Metrics         string  `json:"metrics"`
					T1AverageValue  string  `json:"t1AverageValue"`
					T2AverageValue  string  `json:"t2AverageValue"`
				} `json:"values"`
			} `json:"Perf_sqlexecute"`
			PerfType []struct {
				SubValues any `json:"subValues"`
				Values    struct {
					Components  string `json:"components"`
					Description struct {
						Key       string `json:"key"`
						Variables any    `json:"variables"`
					} `json:"description"`
					Diff            float64 `json:"diff"`
					GrafanaLocation string  `json:"grafanaLocation"`
					Label           string  `json:"label"`
					Metrics         string  `json:"metrics"`
					T1AverageValue  string  `json:"t1AverageValue"`
					T2AverageValue  string  `json:"t2AverageValue"`
				} `json:"values"`
			} `json:"Perf_type"`
		} `json:"performanceMetricsComparison"`
		ResourceMetricsComparison []struct {
			SubValues []struct {
				SubValues any `json:"subValues"`
				Values    struct {
					Components  string `json:"components"`
					Description struct {
						Key       string `json:"key"`
						Variables any    `json:"variables"`
					} `json:"description"`
					Diff            float64 `json:"diff"`
					GrafanaLocation string  `json:"grafanaLocation"`
					Label           string  `json:"label"`
					Metrics         string  `json:"metrics"`
					T1AverageValue  string  `json:"t1AverageValue"`
					T2AverageValue  string  `json:"t2AverageValue"`
				} `json:"values"`
			} `json:"subValues"`
			Values struct {
				Components  string `json:"components"`
				Description struct {
					Key       string `json:"key"`
					Variables any    `json:"variables"`
				} `json:"description"`
				Diff            int    `json:"diff"`
				GrafanaLocation string `json:"grafanaLocation"`
				Label           string `json:"label"`
				Metrics         string `json:"metrics"`
				T1AverageValue  string `json:"t1AverageValue"`
				T2AverageValue  string `json:"t2AverageValue"`
			} `json:"values"`
		} `json:"resourceMetricsComparison"`
	}
)

// PerformanceInsights structs.
type (
// TODO(@xuyifan02): Under working.
)
