package repo

import (
	"context"
	"fmt"

	"gorm.io/gorm"

	"github.com/pingcap-inc/clinic_cloud_server/pkg/db"
)

type AlertmanagerTokenRepo struct{}

func (repo *AlertmanagerTokenRepo) Save(ctx context.Context,
	item *db.AlertmanagerToken,
) error {
	wdb := db.GetDB()
	err := wdb.Save(item).Error
	if err != nil {
		return fmt.Errorf("save alertmanager token for tenant %d failed: %w", item.TenantID, err)
	}
	return nil
}

type AlertmanagerTokenQuery struct {
	TenantId uint64
	Username string
}

func (q AlertmanagerTokenQuery) Build(tx *gorm.DB) *gorm.DB {
	if q.TenantId != 0 {
		tx = tx.Where("tenant_id = ?", q.TenantId)
	} else if len(q.Username) != 0 {
		tx = tx.Where("username = ?", q.Username)
	}

	return tx
}

func (repo *AlertmanagerTokenRepo) Query(ctx context.Context,
	query AlertmanagerTokenQuery,
) (*db.AlertmanagerToken, error) {
	rdb := db.GetDB().Model(&db.AlertmanagerToken{})
	rdb = query.Build(rdb)

	token := make([]*db.AlertmanagerToken, 0)
	err := rdb.Find(&token).Error
	if err != nil {
		return nil, err
	}
	if len(token) == 0 {
		return nil, gorm.ErrRecordNotFound
	}
	return token[0], nil
}
