package metric_agent

import (
	"strings"

	"github.com/pingcap/errors"
	yamlv2 "gopkg.in/yaml.v2"

	"github.com/tidbcloud/infra-api/pkg/o11y/prom_config"
)

var conf = `
scrape_configs:
  - job_name: ${NAMESPACE}-node-exporter
    honor_labels: true
    scrape_interval: 15s
    scheme: http
    params:
      collect[]:
        - meminfo
        - cpu
    kubernetes_sd_configs:
    - api_server: null
      role: pod
      namespaces:
        names:
        - ${NAMESPACE}
    relabel_configs:
    - source_labels:
      - __meta_kubernetes_pod_label_app_kubernetes_io_instance
      action: keep
      regex: db
    - source_labels:
      - __meta_kubernetes_namespace
      action: keep
      regex: ${NAMESPACE}
    - source_labels:
      - __meta_kubernetes_pod_annotation_prometheus_io_scrape
      action: keep
      regex: "true"
    - source_labels:
      - __meta_kubernetes_pod_label_app_kubernetes_io_component
      action: keep
      regex: pd|tikv|tidb|tiflash
    - action: replace
      regex: (.+)
      replacement: $1:16909
      target_label: __address__
      source_labels:
      - __meta_kubernetes_pod_host_ip
    - source_labels:
      - __meta_kubernetes_pod_label_app_kubernetes_io_instance
      action: replace
      target_label: cluster
    - source_labels:
      - __meta_kubernetes_pod_name
      action: replace
      target_label: instance
    - source_labels:
      - __meta_kubernetes_pod_label_app_kubernetes_io_component
      action: replace
      target_label: component
    - source_labels:
      - __meta_kubernetes_namespace
      - __meta_kubernetes_pod_label_app_kubernetes_io_instance
      separator: '-'
      target_label: tidb_cluster
    metric_relabel_configs:
    - source_labels:
      - __name__
      action: keep
      regex: 'node_cpu_seconds_total|node_memory_MemTotal_bytes|node_memory_MemAvailable_bytes'
  - job_name: ${NAMESPACE}-kubelet
    honor_labels: true
    scrape_interval: 15s
    scheme: https
    bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
    kubernetes_sd_configs:
    - api_server: null
      role: pod
      namespaces:
        names:
        - ${NAMESPACE}
    tls_config:
      insecure_skip_verify: true
      ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
    relabel_configs:
    - source_labels:
      - __meta_kubernetes_pod_label_app_kubernetes_io_instance
      action: keep
      regex: db
    - source_labels:
      - __meta_kubernetes_namespace
      action: keep
      regex: ${NAMESPACE}
    - source_labels:
      - __meta_kubernetes_pod_label_app_kubernetes_io_component
      action: keep
      regex: pd|tikv|tidb|tiflash
    - action: replace
      regex: (.+)
      replacement: $1:10250
      target_label: __address__
      source_labels:
      - __meta_kubernetes_pod_host_ip
    - source_labels:
      - __meta_kubernetes_pod_label_app_kubernetes_io_instance
      action: replace
      target_label: cluster
    - source_labels:
      - __meta_kubernetes_pod_name
      action: replace
      target_label: instance
    - source_labels:
      - __meta_kubernetes_pod_label_app_kubernetes_io_component
      action: replace
      target_label: component
    - source_labels:
      - __meta_kubernetes_namespace
      - __meta_kubernetes_pod_label_app_kubernetes_io_instance
      separator: '-'
      target_label: tidb_cluster
    metric_relabel_configs:
    - source_labels:
      - namespace
      action: keep
      regex: ${NAMESPACE}
    - source_labels:
      - __name__
      action: keep
      regex: 'kubelet_volume_stats_available_bytes|kubelet_volume_stats_capacity_bytes'
`

func extraScrapeConf(namespace string) ([]*prom_config.ScrapeConfig, error) {
	raw := strings.ReplaceAll(conf, "${NAMESPACE}", namespace)
	PromConfig := &prom_config.PromConfig{}
	if err := yamlv2.Unmarshal([]byte(raw), PromConfig); err != nil {
		return nil, errors.Annotate(err, "failed to unmarshal extra prom config")
	}
	return PromConfig.ScrapeConfigs, nil
}
