package metrics

import (
	"fmt"
	"strings"
)

// ==================== Grafana Link 模板定义 ====================

// TiDB CPU 系列共用模板
// Dashboard: 8c16287e9fd72206tidbcloud, Panel: 168
// 指标: TiDB_CPU, TiDB_CPU_P90, TiDB_CPU_P80, TiDB_CPU_P90_P90, TiDB_CPU_P90_AVG, TiDB_CPU_P80_P90, TiDB_CPU_P80_AVG, TiDB_CPU_AVG
const TiDBCPULinkTemplate = "{webHost}/grafana/d/8c16287e9fd72206tidbcloudv{version}/tidb-cluster-clinic?orgId=1&var-tidb_cluster={clusterId}&var-instance=All&var-store=All&from={from}&to={to}&var-tidb_version={tidbVersion}&var-org={varOrgId}&refresh=15m&var-org_type=cloud&viewPanel=168"

// TiKV CPU 系列共用模板
// Dashboard: e53523ea9ee7fcf4tidbcloud, Panel: 8
// 指标: TiKV_CPU, TiKV_CPU_P90, TiKV_CPU_P80, TiKV_CPU_P90_P90, TiKV_CPU_P90_AVG, TiKV_CPU_P80_P90, TiKV_CPU_P80_AVG, TiKV_CPU_AVG
const TiKVCPULinkTemplate = "{webHost}/grafana/d/e53523ea9ee7fcf4tidbcloudv{version}/tikv-details-cluster-clinic?orgId=1&var-tidb_cluster={clusterId}&var-instance=All&var-store=All&from={from}&to={to}&var-tidb_version={tidbVersion}&var-org={varOrgId}&refresh=15m&var-org_type=cloud&viewPanel=8"

// TiDB MEM 系列共用模板
// Dashboard: 8c16287e9fd72206tidbcloud, Panel: 3
// 指标: TiDB_MEM, TiDB_MEM_P90, TiDB_MEM_P80, TiDB_MEM_P90_P90, TiDB_MEM_P90_AVG, TiDB_MEM_P80_P90, TiDB_MEM_P80_AVG, TiDB_MEM_AVG
const TiDBMEMLinkTemplate = "{webHost}/grafana/d/8c16287e9fd72206tidbcloudv{version}/tidb-cluster-clinic?orgId=1&var-tidb_cluster={clusterId}&var-instance=All&var-store=All&from={from}&to={to}&var-tidb_version={tidbVersion}&var-org={varOrgId}&refresh=15m&var-org_type=cloud&viewPanel=3"

// TiKV MEM 系列共用模板
// Dashboard: e53523ea9ee7fcf4tidbcloud, Panel: 9
// 指标: TiKV_MEM, TiKV_MEM_P90, TiKV_MEM_P80, TiKV_MEM_P90_P90, TiKV_MEM_P90_AVG, TiKV_MEM_P80_P90, TiKV_MEM_P80_AVG, TiKV_MEM_AVG
const TiKVMEMLinkTemplate = "{webHost}/grafana/d/e53523ea9ee7fcf4tidbcloudv{version}/tikv-details-cluster-clinic?orgId=1&var-tidb_cluster={clusterId}&var-instance=All&var-store=All&from={from}&to={to}&var-tidb_version={tidbVersion}&var-org={varOrgId}&refresh=15m&var-org_type=cloud&viewPanel=9"

// P999 Query Latency 模板
// Dashboard: 8c16287e9fd72206tidbcloud, Panel: 81
const P999QueryLatencyLinkTemplate = "{webHost}/grafana/d/8c16287e9fd72206tidbcloudv{version}/tidb-cluster-clinic?orgId=1&var-tidb_cluster={clusterId}&var-instance=All&var-store=All&from={from}&to={to}&var-tidb_version={tidbVersion}&var-org={varOrgId}&refresh=15m&var-org_type=cloud&viewPanel=81"

// P99 Query Latency 模板
// Dashboard: 8c16287e9fd72206tidbcloud, Panel: 25
const P99QueryLatencyLinkTemplate = "{webHost}/grafana/d/8c16287e9fd72206tidbcloudv{version}/tidb-cluster-clinic?orgId=1&var-tidb_cluster={clusterId}&var-instance=All&var-store=All&from={from}&to={to}&var-tidb_version={tidbVersion}&var-org={varOrgId}&refresh=15m&var-org_type=cloud&viewPanel=25"

// P99 TiKV Latency 模板
// Dashboard: 459a3ee585229796tidbcloud, Panel: 98
const P99TiKVLatencyLinkTemplate = "{webHost}/grafana/d/459a3ee585229796tidbcloudv{version}/tikv-summary-cluster-clinic?orgId=1&var-tidb_cluster={clusterId}&var-instance=All&var-store=All&from={from}&to={to}&var-tidb_version={tidbVersion}&var-org={varOrgId}&refresh=15m&var-org_type=cloud&viewPanel=98"

// CPS 模板
// Dashboard: 8c16287e9fd72206tidbcloud, Panel: 2
const CPSLinkTemplate = "{webHost}/grafana/d/8c16287e9fd72206tidbcloudv{version}/tidb-cluster-clinic?orgId=1&var-tidb_cluster={clusterId}&var-instance=All&var-store=All&from={from}&to={to}&var-tidb_version={tidbVersion}&var-org={varOrgId}&refresh=15m&var-org_type=cloud&viewPanel=2"

// QPS 模板
// Dashboard: 8c16287e9fd72206tidbcloud, Panel: 21
const QPSLinkTemplate = "{webHost}/grafana/d/8c16287e9fd72206tidbcloudv{version}/tidb-cluster-clinic?orgId=1&var-tidb_cluster={clusterId}&var-instance=All&var-store=All&from={from}&to={to}&var-tidb_version={tidbVersion}&var-org={varOrgId}&var-org_type=cloud&viewPanel=21"

// Disk Usage 模板
// Dashboard: e53523ea9ee7fcf4tidbcloud, Panel: 5
const DiskUsageLinkTemplate = "{webHost}/grafana/d/e53523ea9ee7fcf4tidbcloudv{version}/tikv-details-cluster-clinic?orgId=1&var-tidb_cluster={clusterId}&var-instance=All&var-store=All&from={from}&to={to}&var-tidb_version={tidbVersion}&var-org={varOrgId}&refresh=15m&var-org_type=cloud&viewPanel=5"

// Read/Write Wait Latency 共用模板（特殊：没有版本号，参数结构不同）
// Dashboard: clinic-dataplane-node/dedicated-dataplane-node-info, Panel: 22
const DataplaneNodeLatencyLinkTemplate = "{webHost}/grafana/d/clinic-dataplane-node/dedicated-dataplane-node-info?orgId=1&var-k8s_cluster=All&var-tidb_cluster={clusterId}&var-namespace=tidb{clusterId}&from={from}&to={to}&viewPanel=22"

// ==================== Grafana Link 映射表 ====================

// grafanaLinkTemplates 定义每个指标到 URL 模板的映射
var grafanaLinkTemplates = map[string]string{
	// TiDB CPU 系列 - 共用 TiDBCPULinkTemplate
	"TiDB_CPU":       TiDBCPULinkTemplate,
	"TiDB_CPU_P90":   TiDBCPULinkTemplate,
	"TiDB_CPU_P80":   TiDBCPULinkTemplate,
	"TiDB_CPU_P90_P90": TiDBCPULinkTemplate,
	"TiDB_CPU_P90_AVG": TiDBCPULinkTemplate,
	"TiDB_CPU_P80_P90": TiDBCPULinkTemplate,
	"TiDB_CPU_P80_AVG": TiDBCPULinkTemplate,
	"TiDB_CPU_AVG":     TiDBCPULinkTemplate,

	// TiKV CPU 系列 - 共用 TiKVCPULinkTemplate
	"TiKV_CPU":       TiKVCPULinkTemplate,
	"TiKV_CPU_P90":   TiKVCPULinkTemplate,
	"TiKV_CPU_P80":   TiKVCPULinkTemplate,
	"TiKV_CPU_P90_P90": TiKVCPULinkTemplate,
	"TiKV_CPU_P90_AVG": TiKVCPULinkTemplate,
	"TiKV_CPU_P80_P90": TiKVCPULinkTemplate,
	"TiKV_CPU_P80_AVG": TiKVCPULinkTemplate,
	"TiKV_CPU_AVG":     TiKVCPULinkTemplate,

	// TiDB MEM 系列 - 共用 TiDBMEMLinkTemplate
	"TiDB_MEM":       TiDBMEMLinkTemplate,
	"TiDB_MEM_P90":   TiDBMEMLinkTemplate,
	"TiDB_MEM_P80":   TiDBMEMLinkTemplate,
	"TiDB_MEM_P90_P90": TiDBMEMLinkTemplate,
	"TiDB_MEM_P90_AVG": TiDBMEMLinkTemplate,
	"TiDB_MEM_P80_P90": TiDBMEMLinkTemplate,
	"TiDB_MEM_P80_AVG": TiDBMEMLinkTemplate,
	"TiDB_MEM_AVG":     TiDBMEMLinkTemplate,

	// TiKV MEM 系列 - 共用 TiKVMEMLinkTemplate
	"TiKV_MEM":       TiKVMEMLinkTemplate,
	"TiKV_MEM_P90":   TiKVMEMLinkTemplate,
	"TiKV_MEM_P80":   TiKVMEMLinkTemplate,
	"TiKV_MEM_P90_P90": TiKVMEMLinkTemplate,
	"TiKV_MEM_P90_AVG": TiKVMEMLinkTemplate,
	"TiKV_MEM_P80_P90": TiKVMEMLinkTemplate,
	"TiKV_MEM_P80_AVG": TiKVMEMLinkTemplate,
	"TiKV_MEM_AVG":     TiKVMEMLinkTemplate,

	// Query Latency 系列
	"P999QueryLatency": P999QueryLatencyLinkTemplate,
	"P99QueryLatency":  P99QueryLatencyLinkTemplate,

	// TiKV Latency
	"P99TiKVLatency":                 P99TiKVLatencyLinkTemplate,
	"P99TiKVLatency_coprocessor":     P99TiKVLatencyLinkTemplate,
	"P99TiKVLatency_kv_prewrite":     P99TiKVLatencyLinkTemplate,
	"P99RegionNum":                   P99TiKVLatencyLinkTemplate,
	"P99TnxDuration_optimistic":      P99TiKVLatencyLinkTemplate,
	"P99TnxDuration_pessimistic":     P99TiKVLatencyLinkTemplate,
	"P99WriteTiKV":                   P99TiKVLatencyLinkTemplate,

	// Performance 系列
	"CPS": CPSLinkTemplate,
	"QPS": QPSLinkTemplate,

	// Disk 系列
	"DiskUsage": DiskUsageLinkTemplate,

	// Dataplane Node Latency（特殊：不同的 URL 结构）
	"ReadWaitLatency":  DataplaneNodeLatencyLinkTemplate,
	"WriteWaitLatency": DataplaneNodeLatencyLinkTemplate,
}

// ==================== Link 生成函数 ====================

// BuildGrafanaLink 根据 queryName 和动态参数生成完整的 Grafana link
// 使用字符串替换的方式填充占位符
func BuildGrafanaLink(webHost, queryName, clusterId, varOrgId, tidbVersion string, fromTimestamp, toTimestamp int64) string {
	// 查找模板
	template, exists := grafanaLinkTemplates[queryName]
	if !exists || template == "" {
		return ""
	}

	// 提取版本标签：v8.5.x → 8_5_x
	versionTag := extractVersionTag(tidbVersion)

	// 替换所有占位符
	link := template
	link = strings.ReplaceAll(link, "{webHost}", webHost)
	link = strings.ReplaceAll(link, "{version}", versionTag)
	link = strings.ReplaceAll(link, "{clusterId}", clusterId)
	link = strings.ReplaceAll(link, "{varOrgId}", varOrgId)
	link = strings.ReplaceAll(link, "{tidbVersion}", tidbVersion)
	link = strings.ReplaceAll(link, "{from}", fmt.Sprintf("%d", fromTimestamp))
	link = strings.ReplaceAll(link, "{to}", fmt.Sprintf("%d", toTimestamp))

	return link
}

// extractVersionTag 从 tidbVersion 中提取版本标签
// 例如：v8.5.x → 8_5_x
func extractVersionTag(tidbVersion string) string {
	version := strings.TrimPrefix(tidbVersion, "v")
	return strings.ReplaceAll(version, ".", "_")
}
