package dbutil

import (
	"crypto/sha256"
	"encoding/hex"

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

func encode(input string) string {
	keyHashBytes := sha256.Sum256([]byte(input))
	return hex.EncodeToString(keyHashBytes[:])
}

func CreateMetricsKey(tx *gorm.DB, projectID, userID entity.ID, key string) (*entity.MetricsKey, error) {
	encodedKey := encode(key)

	item := entity.MetricsKey{
		ProjectID: projectID,
		UserID:    userID,
		KeyHash:   encodedKey,
	}

	err := tx.Create(&item).Error

	return &item, err
}

func DeleteMetricsKey(tx *gorm.DB, keyID, projectID entity.ID) error {
	return entity.NewMetricsKeyQuerySet(tx).IDEq(keyID).ProjectIDEq(projectID).Delete()
}

func GetAllMetricsKeyByProject(tx *gorm.DB, projectID entity.ID) ([]entity.MetricsKey, error) {
	var metricsKeys []entity.MetricsKey

	err := entity.NewMetricsKeyQuerySet(tx).ProjectIDEq(projectID).OrderAscByCreatedAt().All(&metricsKeys)

	if err != nil {
		return nil, err
	}

	return metricsKeys, err
}

func GetMetricsKeyByID(tx *gorm.DB, keyID, projectID entity.ID) (*entity.MetricsKey, error) {
	var metricsKey entity.MetricsKey

	err := entity.NewMetricsKeyQuerySet(tx).IDEq(keyID).ProjectIDEq(projectID).One(&metricsKey)

	if err != nil {
		return nil, err
	}

	return &metricsKey, err
}

func GetMetricsKeyByKey(tx *gorm.DB, key string, projectID entity.ID) (*entity.MetricsKey, error) {
	var metricsKey entity.MetricsKey

	err := entity.NewMetricsKeyQuerySet(tx).KeyHashEq(encode(key)).ProjectIDEq(projectID).One(&metricsKey)
	if err != nil {
		return nil, err
	}

	return &metricsKey, err
}

func GetMetricsKeyByKeyHash(tx *gorm.DB, keyHash string, projectID entity.ID) (*entity.MetricsKey, error) {
	var metricsKey entity.MetricsKey

	err := entity.NewMetricsKeyQuerySet(tx).KeyHashEq(keyHash).ProjectIDEq(projectID).One(&metricsKey)
	if err != nil {
		return nil, err
	}

	return &metricsKey, err
}
