package vm

import (
	"text/template"
)

var (
	topkQueryTmp                  = template.Must(template.New("topk-metrics").Parse(topkMetricsQLTemplate))
	topkQueryTmpForNextGenHost    = template.Must(template.New("topk-metrics-nextgen-host").Parse(topkMetricsQLTemplateForNextGenHost))
	cpuTimeQueryTmp               = template.Must(template.New("cputime-metrics").Parse(cpuTimeMetricsQLTemplate))
	cpuTimeQueryTmpForNextGenHost = template.Must(template.New("cputime-metrics-nextgen-host").Parse(cpuTimeMetricsQLTemplateForNextGenHost))
	summaryQueryTmp               = template.Must(template.New("summary-metrics").Parse(summaryMetricsQLTemplate))
	summaryQueryTmpForNextGenHost = template.Must(template.New("summary-metrics-nextgen-host").Parse(summaryMetricsQLTemplateForNextGenHost))
	metaQueryTmp                  = template.Must(template.New("meta-metrics").Parse(metaMetricsQLTemplate))
	metaQueryTmpForNextGenHost    = template.Must(template.New("meta-metrics-nextgen-host").Parse(metaMetricsQLTemplateForNextGenHost))
)

const topkMetricsQLTemplate = `
topk(
  {{ .Topk }},
  sum by (sql_digest) (
    sum_over_time(
      topsql_cpu_time_ms{
        cluster_id="{{ .ClusterID }}",
        instance="{{ .Instance }}",
        instance_type="{{ .InstanceType }}",
        sql_digest!="",
      }[{{ .RangeSecs }}s]
    )
  )
)`

const topkMetricsQLTemplateForNextGenHost = `
topk(
  {{ .Topk }},
  sum by (sql_digest) (
    sum_over_time(
      topsql_cpu_time_ms{
        sharedpool_id="{{ .ClusterID }}",
        instance="{{ .Instance }}",
        instance_type="{{ .InstanceType }}",
        sql_digest!="",
      }[{{ .RangeSecs }}s]
    )
  )
)`

const cpuTimeMetricsQLTemplate = `
label_set(
  sum by (sql_digest, plan_digest) (
    sum_over_time(
      topsql_cpu_time_ms{
        cluster_id="{{ .ClusterID }}",
        instance="{{ .Instance }}",
        instance_type="{{ .InstanceType }}",
        sql_digest=~"{{ .TopkRegex }}",
      }[{{ .WindowSecs }}s]
    )
  ),
  "is_other", "false"
) or label_set(
  sum(
    sum_over_time(
      topsql_cpu_time_ms{
        cluster_id="{{ .ClusterID }}",
        instance="{{ .Instance }}",
        instance_type="{{ .InstanceType }}",
        sql_digest!~"{{ .TopkRegex }}",
      }[{{ .WindowSecs }}s]
    )
  ),
  "is_other", "true"
)`

const cpuTimeMetricsQLTemplateForNextGenHost = `
label_set(
  sum by (sql_digest, plan_digest) (
    sum_over_time(
      topsql_cpu_time_ms{
        sharedpool_id="{{ .ClusterID }}",
        instance="{{ .Instance }}",
        instance_type="{{ .InstanceType }}",
        sql_digest=~"{{ .TopkRegex }}",
      }[{{ .WindowSecs }}s]
    )
  ),
  "is_other", "false"
) or label_set(
  sum(
    sum_over_time(
      topsql_cpu_time_ms{
        sharedpool_id="{{ .ClusterID }}",
        instance="{{ .Instance }}",
        instance_type="{{ .InstanceType }}",
        sql_digest!~"{{ .TopkRegex }}",
      }[{{ .WindowSecs }}s]
    )
  ),
  "is_other", "true"
)`

const summaryMetricsQLTemplate = `
label_set(
  (
    label_set(
      sum by (sql_digest) (sum_over_time(topsql_cpu_time_ms{
        cluster_id="{{ .ClusterID }}",
        instance="{{ .Instance }}",
        instance_type="{{ .InstanceType }}",
        sql_digest=~"{{ .TopkRegex }}",
      }[{{ .RangeSecs }}s])),
      "summary_type", "cpu_time_ms"
    ) or label_set(
      sum by (sql_digest) (sum_over_time(topsql_stmt_exec_count{
        cluster_id="{{ .ClusterID }}",
        instance="{{ .Instance }}",
        instance_type="{{ .InstanceType }}",
        sql_digest=~"{{ .TopkRegex }}",
      }[{{ .RangeSecs }}s])) / {{ .RangeSecs }},
      "summary_type", "exec_count_per_sec"
    ) or label_set(
      (sum by (sql_digest) (sum_over_time(topsql_stmt_duration_sum_ns{
        cluster_id="{{ .ClusterID }}",
        instance="{{ .Instance }}",
        instance_type="{{ .InstanceType }}",
        sql_digest=~"{{ .TopkRegex }}",
      }[{{ .RangeSecs }}s])) / 1000000) /
      (sum by (sql_digest) (sum_over_time(topsql_stmt_duration_count{
        cluster_id="{{ .ClusterID }}",
        instance="{{ .Instance }}",
        instance_type="{{ .InstanceType }}",
        sql_digest=~"{{ .TopkRegex }}",
      }[{{ .RangeSecs }}s]))),
      "summary_type", "duration_per_exec_ms"
    ) or label_set(
      sum by (sql_digest) (sum_over_time(topsql_read_keys{
        cluster_id="{{ .ClusterID }}",
        instance="{{ .Instance }}",
        instance_type="{{ .InstanceType }}",
        sql_digest=~"{{ .TopkRegex }}",
        tag_label="row",
      }[{{ .RangeSecs }}s])) / {{ .RangeSecs }},
      "summary_type", "scan_records_per_sec"
    ) or label_set(
      sum by (sql_digest) (sum_over_time(topsql_read_keys{
        cluster_id="{{ .ClusterID }}",
        instance="{{ .Instance }}",
        instance_type="{{ .InstanceType }}",
        sql_digest=~"{{ .TopkRegex }}",
        tag_label="index",
      }[{{ .RangeSecs }}s])) / {{ .RangeSecs }},
      "summary_type", "scan_indexes_per_sec"
    )
  ),
  "is_grouped", "true"
) or label_set(
  (
    label_set(
      sum by (sql_digest, plan_digest) (sum_over_time(topsql_stmt_exec_count{
        cluster_id="{{ .ClusterID }}",
        instance="{{ .Instance }}",
        instance_type="{{ .InstanceType }}",
        sql_digest=~"{{ .TopkRegex }}",
      }[{{ .RangeSecs }}s])) / {{ .RangeSecs }},
      "summary_type", "exec_count_per_sec"
    ) or label_set(
      (sum by (sql_digest, plan_digest) (sum_over_time(topsql_stmt_duration_sum_ns{
        cluster_id="{{ .ClusterID }}",
        instance="{{ .Instance }}",
        instance_type="{{ .InstanceType }}",
        sql_digest=~"{{ .TopkRegex }}",
      }[{{ .RangeSecs }}s])) / 1000000) /
      (sum by (sql_digest, plan_digest) (sum_over_time(topsql_stmt_duration_count{
        cluster_id="{{ .ClusterID }}",
        instance="{{ .Instance }}",
        instance_type="{{ .InstanceType }}",
        sql_digest=~"{{ .TopkRegex }}",
      }[{{ .RangeSecs }}s]))),
      "summary_type", "duration_per_exec_ms"
    ) or label_set(
      sum by (sql_digest, plan_digest) (sum_over_time(topsql_read_keys{
        cluster_id="{{ .ClusterID }}",
        instance="{{ .Instance }}",
        instance_type="{{ .InstanceType }}",
        sql_digest=~"{{ .TopkRegex }}",
        tag_label="row",
      }[{{ .RangeSecs }}s])) / {{ .RangeSecs }},
      "summary_type", "scan_records_per_sec"
    ) or label_set(
      sum by (sql_digest, plan_digest) (sum_over_time(topsql_read_keys{
        cluster_id="{{ .ClusterID }}",
        instance="{{ .Instance }}",
        instance_type="{{ .InstanceType }}",
        sql_digest=~"{{ .TopkRegex }}",
        tag_label="index",
      }[{{ .RangeSecs }}s])) / {{ .RangeSecs }},
      "summary_type", "scan_indexes_per_sec"
    )
  ),
  "is_grouped", "false"
)`

const summaryMetricsQLTemplateForNextGenHost = `
label_set(
  (
    label_set(
      sum by (sql_digest) (sum_over_time(topsql_cpu_time_ms{
        sharedpool_id="{{ .ClusterID }}",
        instance="{{ .Instance }}",
        instance_type="{{ .InstanceType }}",
        sql_digest=~"{{ .TopkRegex }}",
      }[{{ .RangeSecs }}s])),
      "summary_type", "cpu_time_ms"
    ) or label_set(
      sum by (sql_digest) (sum_over_time(topsql_stmt_exec_count{
        sharedpool_id="{{ .ClusterID }}",
        instance="{{ .Instance }}",
        instance_type="{{ .InstanceType }}",
        sql_digest=~"{{ .TopkRegex }}",
      }[{{ .RangeSecs }}s])) / {{ .RangeSecs }},
      "summary_type", "exec_count_per_sec"
    ) or label_set(
      (sum by (sql_digest) (sum_over_time(topsql_stmt_duration_sum_ns{
        sharedpool_id="{{ .ClusterID }}",
        instance="{{ .Instance }}",
        instance_type="{{ .InstanceType }}",
        sql_digest=~"{{ .TopkRegex }}",
      }[{{ .RangeSecs }}s])) / 1000000) /
      (sum by (sql_digest) (sum_over_time(topsql_stmt_duration_count{
        sharedpool_id="{{ .ClusterID }}",
        instance="{{ .Instance }}",
        instance_type="{{ .InstanceType }}",
        sql_digest=~"{{ .TopkRegex }}",
      }[{{ .RangeSecs }}s]))),
      "summary_type", "duration_per_exec_ms"
    ) or label_set(
      sum by (sql_digest) (sum_over_time(topsql_read_keys{
        sharedpool_id="{{ .ClusterID }}",
        instance="{{ .Instance }}",
        instance_type="{{ .InstanceType }}",
        sql_digest=~"{{ .TopkRegex }}",
        tag_label="row",
      }[{{ .RangeSecs }}s])) / {{ .RangeSecs }},
      "summary_type", "scan_records_per_sec"
    ) or label_set(
      sum by (sql_digest) (sum_over_time(topsql_read_keys{
        sharedpool_id="{{ .ClusterID }}",
        instance="{{ .Instance }}",
        instance_type="{{ .InstanceType }}",
        sql_digest=~"{{ .TopkRegex }}",
        tag_label="index",
      }[{{ .RangeSecs }}s])) / {{ .RangeSecs }},
      "summary_type", "scan_indexes_per_sec"
    )
  ),
  "is_grouped", "true"
) or label_set(
  (
    label_set(
      sum by (sql_digest, plan_digest) (sum_over_time(topsql_stmt_exec_count{
        sharedpool_id="{{ .ClusterID }}",
        instance="{{ .Instance }}",
        instance_type="{{ .InstanceType }}",
        sql_digest=~"{{ .TopkRegex }}",
      }[{{ .RangeSecs }}s])) / {{ .RangeSecs }},
      "summary_type", "exec_count_per_sec"
    ) or label_set(
      (sum by (sql_digest, plan_digest) (sum_over_time(topsql_stmt_duration_sum_ns{
        sharedpool_id="{{ .ClusterID }}",
        instance="{{ .Instance }}",
        instance_type="{{ .InstanceType }}",
        sql_digest=~"{{ .TopkRegex }}",
      }[{{ .RangeSecs }}s])) / 1000000) /
      (sum by (sql_digest, plan_digest) (sum_over_time(topsql_stmt_duration_count{
        sharedpool_id="{{ .ClusterID }}",
        instance="{{ .Instance }}",
        instance_type="{{ .InstanceType }}",
        sql_digest=~"{{ .TopkRegex }}",
      }[{{ .RangeSecs }}s]))),
      "summary_type", "duration_per_exec_ms"
    ) or label_set(
      sum by (sql_digest, plan_digest) (sum_over_time(topsql_read_keys{
        sharedpool_id="{{ .ClusterID }}",
        instance="{{ .Instance }}",
        instance_type="{{ .InstanceType }}",
        sql_digest=~"{{ .TopkRegex }}",
        tag_label="row",
      }[{{ .RangeSecs }}s])) / {{ .RangeSecs }},
      "summary_type", "scan_records_per_sec"
    ) or label_set(
      sum by (sql_digest, plan_digest) (sum_over_time(topsql_read_keys{
        sharedpool_id="{{ .ClusterID }}",
        instance="{{ .Instance }}",
        instance_type="{{ .InstanceType }}",
        sql_digest=~"{{ .TopkRegex }}",
        tag_label="index",
      }[{{ .RangeSecs }}s])) / {{ .RangeSecs }},
      "summary_type", "scan_indexes_per_sec"
    )
  ),
  "is_grouped", "false"
)`

const metaMetricsQLTemplate = `
(
  present_over_time(topsql_sql_meta{
    cluster_id="{{ .ClusterID }}",
    sql_digest=~"{{ .TopkRegex }}",
  }[{{ .RangeSecs }}s])
) or (
  present_over_time(topsql_plan_meta{
    cluster_id="{{ .ClusterID }}",
    plan_digest=~"{{ .PlanDigestRegex }}",
  }[{{ .RangeSecs }}s])
)`

const metaMetricsQLTemplateForNextGenHost = `
(
  present_over_time(topsql_sql_meta{
    sharedpool_id="{{ .ClusterID }}",
    sql_digest=~"{{ .TopkRegex }}",
  }[{{ .RangeSecs }}s])
) or (
  present_over_time(topsql_plan_meta{
    sharedpool_id="{{ .ClusterID }}",
    plan_digest=~"{{ .PlanDigestRegex }}",
  }[{{ .RangeSecs }}s])
)`
