package service

import (
	"context"
	"sync"

	confMetrics "github.com/pingcap-inc/clinic/clinic_data_service/pkg/config/metrics"
	dtoMetrics "github.com/pingcap-inc/clinic/clinic_data_service/pkg/dto/metrics"
	"github.com/pingcap-inc/clinic/clinic_data_service/pkg/log"
	"github.com/pingcap-inc/clinic/clinic_data_service/pkg/metrics"
	"github.com/pingcap-inc/clinic/clinic_data_service/pkg/model"
	"go.uber.org/zap"
)

// MetricsHealthCheckRequest Metrics 巡检请求
type MetricsHealthCheckRequest struct {
	HealthCheckCommonParameters
}

// MetricsHealthCheckResponse Metrics 巡检响应
type MetricsHealthCheckResponse struct {
	Name          string                         `json:"name"`
	Description   string                         `json:"description"`
	CheckType     string                         `json:"checkType"`
	Status        string                         `json:"status"`
	ResultJsonUrl string                         `json:"resultJsonUrl"`
	Summary       MetricsHealthCheckSummary      `json:"summary"`
	Results       []MetricsHealthCheckResultItem `json:"results"`
}

// MetricsHealthCheckSummary 巡检概览
type MetricsHealthCheckSummary struct {
	TotalMetrics       int `json:"totalMetrics"`
	NeedAttentionCount int `json:"needAttentionCount"`
}

// MetricsHealthCheckResultItem 单条指标巡检结果
type MetricsHealthCheckResultItem struct {
	QueryName       string `json:"queryName"`
	TimeAggregation string `json:"timeAggregation"`
	Threshold       string `json:"threshold"`
	Status          string `json:"status"`
	Max             string `json:"max"`
	Avg             string `json:"avg"`
	Link            string `json:"link"`
}

// MetricsHealthCheckService Metrics 巡检服务
type MetricsHealthCheckService struct {
	configOnce sync.Once
}

// NewMetricsHealthCheckService 创建 Metrics 巡检服务
func NewMetricsHealthCheckService() *MetricsHealthCheckService {
	return &MetricsHealthCheckService{}
}

// ensureConfig 确保 metrics 配置已加载
func (s *MetricsHealthCheckService) ensureConfig() {
	s.configOnce.Do(func() {
		if len(confMetrics.AppConfig.CPUResource) == 0 {
			if err := confMetrics.LoadConfigForMetrics(); err != nil {
				log.PlainError("Failed to load metrics config", zap.Error(err))
			}
		}
	})
}

// Analyze 执行 Metrics 巡检
func (s *MetricsHealthCheckService) Analyze(ctx context.Context, req *MetricsHealthCheckRequest) (*MetricsHealthCheckResponse, error) {
	s.ensureConfig()

	// 从请求入参构建 model.Cluster
	cluster := model.Cluster{
		ClusterID:           req.ClusterId,
		PhysicalClusterID:   req.PhysicalClusterId,
		DeployType:          req.DeployType,
		Region:              req.Region,
		Provider:            req.Provider,
		OrgID:               req.TenantId,
		ProjectID:           req.ProjectId,
		ClusterMetricsURL:   req.ClusterUrls.ClusterMetricsURL,
		DataPlaneMetricsURL: req.ClusterUrls.DataPlaneMetricsURL,
	}

	// 调用核心巡检逻辑（使用请求传入的完整时间范围）
	allResults, err := metrics.GetSingleClusterMetricsResultWithRange(ctx, cluster, req.TimeRange.Start, req.TimeRange.End, req.ClinicOrgId, req.DashboardVersion)
	if err != nil {
		return nil, err
	}

	// 转换为响应格式
	return s.buildResponse(allResults), nil
}

// buildResponse 构建响应
func (s *MetricsHealthCheckService) buildResponse(allResults []dtoMetrics.TableRowAggregation) *MetricsHealthCheckResponse {
	results := make([]MetricsHealthCheckResultItem, 0, len(allResults))
	needAttentionCount := 0

	for _, r := range allResults {
		results = append(results, MetricsHealthCheckResultItem{
			QueryName:       r.QueryName,
			TimeAggregation: r.TimeAggregation,
			Threshold:       r.Threshold,
			Status:          r.Status,
			Max:             r.Max,
			Avg:             r.Avg,
			Link:            r.Link,
		})
		if r.Status == "Need Attention" {
			needAttentionCount++
		}
	}

	return &MetricsHealthCheckResponse{
		Name:        "metrics_healthcheck",
		Description: "Cluster metrics health check: compares current metrics against 14-day baseline",
		CheckType:   "metrics",
		Status:      "success",
		Summary: MetricsHealthCheckSummary{
			TotalMetrics:       len(results),
			NeedAttentionCount: needAttentionCount,
		},
		Results: results,
	}
}
