package datadog

import (
	"fmt"
	"strconv"

	"github.com/tidbcloud/metrics-server/central/db"
	"github.com/tidbcloud/metrics-server/central/db/entity"
	"gorm.io/gorm"
)

func updateErrorStatusInDB(projectID, clusterName, errorMsg string) error {
	intID, err := strconv.ParseUint(projectID, 10, 64)
	if err != nil {
		return err
	}

	return db.Transaction(func(tx *gorm.DB) error {
		reasonMsg := fmt.Sprintf("Backend data pipeline error for cluster %s: %s.", clusterName, errorMsg)
		return entity.NewIntegrationQuerySet(tx).
			ProjectIDEq(entity.ID(intID)).
			StatusEq(entity.IntegrationStatusActive).
			ProviderTypeEq(entity.IntegrationTypeDatadog).
			GetUpdater().
			SetStatus(entity.IntegrationStatusError).
			SetStatusReason(reasonMsg).
			Update()
	})
}

func cleanupErrorStatusInDB(projectID string) error {
	intID, err := strconv.ParseUint(projectID, 10, 64)
	if err != nil {
		return err
	}
	return db.Transaction(func(tx *gorm.DB) error {
		return entity.NewIntegrationQuerySet(tx).
			ProjectIDEq(entity.ID(intID)).
			StatusEq(entity.IntegrationStatusError).
			ProviderTypeEq(entity.IntegrationTypeDatadog).
			GetUpdater().
			SetStatus(entity.IntegrationStatusActive).
			SetStatusReason("").
			Update()
	})
}

func initErrorStatus() ([]entity.Integration, error) {
	is := make([]entity.Integration, 0)
	err := db.Transaction(func(tx *gorm.DB) error {
		q := entity.NewIntegrationQuerySet(tx).
			StatusEq(entity.IntegrationStatusError).
			ProviderTypeEq(entity.IntegrationTypeDatadog)
		return q.All(&is)
	})
	if err != nil {
		return nil, err
	}
	return is, nil
}
