package query

import (
	"github.com/tidbcloud/metrics-server/idl/pbgen/proto/core"
	"github.com/tidbcloud/metrics-server/internal/datasource"
	"github.com/tidbcloud/metrics-server/internal/datasource/central_thanos"
	"github.com/tidbcloud/metrics-server/internal/datasource/shoot_prom"
)

func registryMetrics(cluster *core.Cluster) (allMetricQueries []datasource.MetricQuerierFunc) {
	clusterID := cluster.Id
	return []datasource.MetricQuerierFunc{
		central_thanos.BuildNodeMemoryUsedQuerier(clusterID, "", false),
		central_thanos.BuildNodeMemoryCapacityQuerier(cluster, false),
		shoot_prom.BuildDBQueryRateQuerier(clusterID),
		shoot_prom.BuildDBFailedQueryRateQuerier(clusterID),
		shoot_prom.BuildDBQueryDurationQuerier(clusterID, 99),
		shoot_prom.BuildDBQueryDurationQuerier(clusterID, 80),
		shoot_prom.BuildCPUUsageCoresQuerier(clusterID),
		shoot_prom.BuildDBConnectionsQuerier(clusterID),
		shoot_prom.BuildStorageUsageBytesQuerier(clusterID),
		shoot_prom.BuildStorageCapacityBytesQuerier(clusterID),
	}
}

func registryClusterMetrics(cluster *core.Cluster) []datasource.MetricQuerierFunc {
	clusterID, clusterName := cluster.Id, cluster.Name
	return []datasource.MetricQuerierFunc{
		// node cpu
		central_thanos.BuildNodeCPUCapacityCoresQuerier(cluster),               // tidbcloud_node_cpu_capacity_cores
		central_thanos.BuildNodeCPUSecondsTotalQuerier(clusterID, clusterName), // tidbcloud_node_cpu_seconds_total
		// node memory
		central_thanos.BuildNodeMemoryCapacityQuerier(cluster, true),            //tidbcloud_node_memory_capacity_bytes
		central_thanos.BuildNodeMemoryUsedQuerier(clusterID, clusterName, true), // tidbcloud_node_memory_used_bytes
		// node storage
		central_thanos.BuildNodeStorageCapacityQuerier(cluster),                 // tidbcloud_node_storage_capacity_bytes
		central_thanos.BuildNodeStorageUsedBytesQuerier(clusterID, clusterName), // tidbcloud_node_storage_used_bytes
		central_thanos.BuildNodeStorageAvailableQuerier(cluster),                // tidbcloud_node_storage_available_bytes
		// cluster metricss
		central_thanos.BuildKVRequestDurationQuerier(cluster, true),               // tidbcloud_kv_request_duration
		central_thanos.BuildUptimeQuerier(cluster, true),                          // tidbcloud_component_uptime
		central_thanos.BuildDiskReadLatencyQuerier(cluster, true),                 // tidbcloud_disk_read_latency
		central_thanos.BuildDiskWriteLatencyQuerier(cluster, true),                // tidbcloud_disk_write_latency
		central_thanos.BuildDBConnectionsQuerier(clusterID, clusterName),          // tidbcloud_db_connections_total
		central_thanos.BuildDBFailedQueriesTotalQuerier(clusterID, clusterName),   // tidbcloud_db_failed_queries_total
		central_thanos.BuildDBQueriesTotalQuerier(clusterID, clusterName),         // tidbcloud_db_queries_total
		central_thanos.BuildDBQueryDurationSecondsQuerier(clusterID, clusterName), // tidbcloud_db_query_duration_seconds
		// cdc
		central_thanos.BuildTiCDCChangefeedResolvedTsLagQuerier(clusterID, clusterName), // tidbcloud_ticdc_owner_resolved_ts_lag
		central_thanos.BuildTiCDCLatencyQuerier(clusterID, clusterName),                 // tidbcloud_changefeed_latency
		central_thanos.BuildTiCDCCheckpointTSQuerier(clusterID, clusterName),            // tidbcloud_changefeed_checkpoint_ts
		central_thanos.BuildChangefeedStatusQuerier(clusterID, clusterName),             // tidbcloud_changefeed_status
		central_thanos.BuildTiCDCReplicaRowsQuerier(clusterID, clusterName),             // tidbcloud_changefeed_Replica_rows
		// ru
		central_thanos.BuildRUReadQuerier(clusterID, clusterName),  // resource_manager_resource_unit_read_request_unit
		central_thanos.BuildRUWriteQuerier(clusterID, clusterName), // resource_manager_resource_unit_write_request_unit

		/*central_thanos.BuildDBTotalConnectionQuerier(clusterID, clusterName),          // tidbcloud_db_total_connection
		central_thanos.BuildDBActiveConnectionsQuerier(clusterID, clusterName),        // tidbcloud_db_active_connections
		central_thanos.BuildDBDisconnectionsQuerier(clusterID, clusterName),           // tidbcloud_db_disconnections
		central_thanos.BuildDBDatabaseTimeQuerier(clusterID, clusterName),             // tidbcloud_db_database_time
		central_thanos.BuildDBQueryPerSecondQuerier(clusterID, clusterName),           // tidbcloud_db_query_per_second
		central_thanos.BuildDBFailedQueriesQuerier(clusterID, clusterName),            // tidbcloud_db_failed_queries
		central_thanos.BuildDBCommandPerSecondQuerier(clusterID, clusterName),         // tidbcloud_db_command_per_second
		central_thanos.BuildDBQueriesUsingPlanCacheOpsQuerier(clusterID, clusterName), // tidbcloud_db_queries_using_plan_cache_ops
		central_thanos.BuildDBAverageQueryDurationQuerier(clusterID, clusterName),     // tidbcloud_db_average_query_duration
		central_thanos.BuildDBTransactionPerSecondQuerier(clusterID, clusterName),     // tidbcloud_db_transaction_per_second*/
	}
}
