package monitoring

import (
	"context"
	"fmt"
	v1 "github.com/prometheus/client_golang/api/prometheus/v1"
	"gitlink.org.cn/JointCloud/pcm-coordinator/internal/svc"
	"gitlink.org.cn/JointCloud/pcm-coordinator/internal/types"
	"k8s.io/apimachinery/pkg/util/json"

	"github.com/zeromicro/go-zero/core/logx"
)

type AlertListLogic struct {
	logx.Logger
	ctx    context.Context
	svcCtx *svc.ServiceContext
}

func NewAlertListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AlertListLogic {
	return &AlertListLogic{
		Logger: logx.WithContext(ctx),
		ctx:    ctx,
		svcCtx: svcCtx,
	}
}

type AlertListResp struct {
	Mode int                    `json:"code"`
	Msg  string                 `json:"msg"`
	Data map[string][]*v1.Alert `json:"data"`
}

func (l *AlertListLogic) AlertList(req *types.AlertListReq) (resp *types.AlertListResp, err error) {
	resp = &types.AlertListResp{
		AlertMap: make(map[string]interface{}),
	}

	// query server http url.
	var clusterArray []string

	sql := "select distinct tc.name from t_adapter ta,t_cluster tc where ta.id = tc.adapter_id and label = 'kubernetes' and ta.type = ?"
	if len(req.AdapterId) > 0 {
		sql = fmt.Sprintf("select distinct tc.name from t_adapter ta,t_cluster tc where ta.id = tc.adapter_id and label = 'kubernetes' and ta.type = ? and ta.id = %s", req.AdapterId)
	}
	if len(req.ClusterId) > 0 {
		sql = fmt.Sprintf("select distinct tc.name from t_adapter ta,t_cluster tc where ta.id = tc.adapter_id and label = 'kubernetes' and ta.type = ? and tc.id = %s", req.ClusterId)
	}
	l.svcCtx.DbEngin.Raw(sql, req.AlertType).Scan(&clusterArray)

	for _, clusterName := range clusterArray {
		getResult := l.svcCtx.RedisClient.Get(l.ctx, clusterName)
		if len(getResult.Val()) != 0 {
			var alerts []v1.Alert
			json.Unmarshal([]byte(getResult.Val()), &alerts)

			resp.AlertMap[clusterName] = alerts
		}

	}
	return resp, nil
}
