package entity

import (
	"context"
	"strconv"
	"time"

	"github.com/tidbcloud/tiinf/monitor/tilog"
	"go.uber.org/zap"

	"github.com/tidbcloud/tidb-management-service/utilities/clusterevent"
	"github.com/tidbcloud/tidb-management-service/utilities/grpc/metadata"
)

func NewClusterEvent(
	ctx context.Context,
	c *Cluster,
	eventType clusterevent.EventType,
	status string,
) (*clusterevent.ClusterEvent, error) {
	var (
		operatorId       uint64
		email            string
		openAPIPublicKey string
	)

	reqMeta, err := metadata.ExtractRequestMeta(ctx)
	if err != nil {
		tilog.Warn(ctx, "extract request meta for cluster event", zap.Error(err))
	} else {
		operatorId, err = strconv.ParseUint(reqMeta.UserID, 10, 64)
		if err != nil {
			tilog.Warn(ctx, "parse uint failed", zap.String("id", reqMeta.UserID), zap.Error(err))
		}
		email = reqMeta.Email
		openAPIPublicKey = reqMeta.ApiPublicKey
	}

	clusterId, err := strconv.ParseUint(c.ClusterId, 10, 64)
	if err != nil {
		return nil, err
	}

	return &clusterevent.ClusterEvent{
		TenantID:         c.TenantId,
		ProjectID:        c.ProjectId,
		ClusterID:        clusterId,
		TraceID:          clusterevent.TraceIDFromContext(ctx),
		OperatorID:       operatorId,
		UserEmail:        email,
		OpenAPIPublicKey: openAPIPublicKey,
		IsDevTier:        true,
		Status:           status,
		EventType:        eventType,
		EventCreatedAtMs: time.Now().UnixMilli(),
		ClusterType:      clusterevent.ClusterTypeTidbxInstance,
		ExtraInfo: &clusterevent.EventExtraInfo{
			DurationSeconds: nil,
		},
		ServicePlan: c.ServicePlan.String(),
	}, nil
}
