package prometheus

import (
	"github.com/tidbcloud/metrics-integration/pipeline/central/config"
	"github.com/tidbcloud/metrics-integration/pipeline/central/entity"
	"github.com/tidbcloud/metrics-integration/pipeline/internal/datasource"
	"github.com/tidbcloud/metrics-integration/pipeline/internal/datasource/central_thanos"
)

func registryClusterMetrics(cluster *config.TargetCluster) []datasource.MetricQuerierFunc {
	sp := entity.ServicePlan(cluster.ServicePlan)

	// DB performance metrics — NextGen only (intentionally not enabled for Dedicated).
	// Label differences are handled automatically by VecMetric.EncodePrometheusFormat()
	// based on ServicePlan: for instance-level plans, the encoder
	// renames cluster_* labels to instance_* and drops project_*, instance, and component labels.
	dbMetrics := []datasource.MetricQuerierFunc{
		central_thanos.BuildDBTotalConnectionQuerier(cluster),          // tidbcloud_db_total_connection
		central_thanos.BuildDBActiveConnectionsQuerier(cluster),        // tidbcloud_db_active_connections
		central_thanos.BuildDBDisconnectionsQuerier(cluster),           // tidbcloud_db_disconnections
		central_thanos.BuildDBDatabaseTimeQuerier(cluster),             // tidbcloud_db_database_time
		central_thanos.BuildDBQueryPerSecondQuerier(cluster),           // tidbcloud_db_query_per_second
		central_thanos.BuildDBFailedQueriesQuerier(cluster),            // tidbcloud_db_failed_queries
		central_thanos.BuildDBCommandPerSecondQuerier(cluster),         // tidbcloud_db_command_per_second
		central_thanos.BuildDBQueriesUsingPlanCacheOpsQuerier(cluster), // tidbcloud_db_queries_using_plan_cache_ops
		central_thanos.BuildDBAverageQueryDurationQuerier(cluster),     // tidbcloud_db_average_query_duration
		central_thanos.BuildDBTransactionPerSecondQuerier(cluster),     // tidbcloud_db_transaction_per_second
	}

	if sp.IsNextGen() {
		var all []datasource.MetricQuerierFunc
		if sp.SupportsCDC() {
			// CDC metrics are available for Premium, but not Essential/Starter.
			all = append(all,
				// central_thanos.BuildTiCDCChangefeedResolvedTsLagQuerier(cluster), // tidbcloud_ticdc_owner_resolved_ts_lag
				central_thanos.BuildTiCDCLatencyQuerier(cluster), // tidbcloud_changefeed_latency
				// central_thanos.BuildTiCDCCheckpointTSQuerier(cluster),            // tidbcloud_changefeed_checkpoint_ts
				central_thanos.BuildChangefeedStatusQuerier(cluster), // tidbcloud_changefeed_status
				// central_thanos.BuildTiCDCReplicaRowsQuerier(cluster),             // tidbcloud_changefeed_Replica_rows
			)
		}
		all = append(all,
			// central_thanos.BuildRUReadQuerier(cluster),  // tidbcloud_resource_manager_resource_unit_read_request_unit
			// central_thanos.BuildRUWriteQuerier(cluster), // tidbcloud_resource_manager_resource_unit_write_request_unit
			central_thanos.BuildRUTotalQuerier(cluster), // tidbcloud_resource_manager_resource_request_unit_total
		)
		// DB performance metrics are only enabled for NextGen plans.
		// (They were intentionally commented-out for Dedicated in the original code.)
		all = append(all, dbMetrics...)
		// TiDB X specific: row-based and columnar storage metrics
		all = append(all,
			central_thanos.BuildDBRowStorageUsedBytesQuerier(cluster),      // tidbcloud_db_row_storage_used_bytes
			central_thanos.BuildDBColumnarStorageUsedBytesQuerier(cluster), // tidbcloud_db_columnar_storage_used_bytes
		)
		return all
	} else {
		// Dedicated preserves the historical registration order so the /metrics
		// exposition remains stable for existing consumers.
		return []datasource.MetricQuerierFunc{
			// node cpu
			central_thanos.BuildNodeCPUCapacityCoresQuerier(cluster),    // tidbcloud_node_cpu_capacity_cores
			central_thanos.BuildNodeCPUSecondsTotalQuerier(cluster),     // tidbcloud_node_cpu_seconds_total
			central_thanos.BuildNodeCPUSecondsTotalRateQuerier(cluster), // tidbcloud_node_cpu_seconds_total_rate
			// node memory
			central_thanos.BuildNodeMemoryCapacityQuerier(cluster), // tidbcloud_node_memory_capacity_bytes
			central_thanos.BuildNodeMemoryUsedQuerier(cluster),     // tidbcloud_node_memory_used_bytes
			// node storage
			central_thanos.BuildNodeStorageCapacityQuerier(cluster),  // tidbcloud_node_storage_capacity_bytes
			central_thanos.BuildNodeStorageUsedBytesQuerier(cluster), // tidbcloud_node_storage_used_bytes
			central_thanos.BuildNodeStorageAvailableQuerier(cluster), // tidbcloud_node_storage_available_bytes
			// infra-level metrics
			central_thanos.BuildKVRequestDurationQuerier(cluster),      // tidbcloud_kv_request_duration
			central_thanos.BuildUptimeQuerier(cluster),                 // tidbcloud_component_uptime
			central_thanos.BuildDiskReadLatencyQuerier(cluster),        // tidbcloud_disk_read_latency
			central_thanos.BuildDiskWriteLatencyQuerier(cluster),       // tidbcloud_disk_write_latency
			central_thanos.BuildDBConnectionsQuerier(cluster),          // tidbcloud_db_connections_total
			central_thanos.BuildDBFailedQueriesTotalQuerier(cluster),   // tidbcloud_db_failed_queries_total
			central_thanos.BuildDBQueriesTotalQuerier(cluster),         // tidbcloud_db_queries_total
			central_thanos.BuildDBQueryDurationSecondsQuerier(cluster), // tidbcloud_db_query_duration_seconds
			// cdc
			central_thanos.BuildTiCDCChangefeedResolvedTsLagQuerier(cluster), // tidbcloud_ticdc_owner_resolved_ts_lag
			central_thanos.BuildTiCDCLatencyQuerier(cluster),                 // tidbcloud_changefeed_latency
			central_thanos.BuildTiCDCCheckpointTSQuerier(cluster),            // tidbcloud_changefeed_checkpoint_ts
			central_thanos.BuildChangefeedStatusQuerier(cluster),             // tidbcloud_changefeed_status
			central_thanos.BuildTiCDCReplicaRowsQuerier(cluster),             // tidbcloud_changefeed_Replica_rows
			// ru
			central_thanos.BuildRUReadQuerier(cluster),  // resource_manager_resource_unit_read_request_unit
			central_thanos.BuildRUWriteQuerier(cluster), // resource_manager_resource_unit_write_request_unit
			// central_thanos.BuildRUTotalQuerier(cluster), // tidbcloud_resource_manager_resource_request_unit_total
			// dm
			central_thanos.BuildDMRelayReadErrorCount(cluster),
			central_thanos.BuildDMSyncerReplicationLagBucketQuerier(cluster),
			central_thanos.BuildDMSyncerReplicationLagGaugeQuerier(cluster),
			central_thanos.BuildDMTaskStatusQuerier(cluster),
		}
	}
}
