package admin

import (
	"fmt"

	"github.com/pingcap/errcode"
	"github.com/pingcap/errors"
	"github.com/tidbcloud/central-sdk/config"
	"github.com/tidbcloud/central-sdk/db"
	"github.com/tidbcloud/central-sdk/db/dbutil"
	"github.com/tidbcloud/central-sdk/db/entity"
	"gorm.io/gorm"
)

type Provider struct {
	Name   string
	Status string
}

func (m UserContext) AddProvider(name, status string) error {
	if m.tenantAndUser.ID == 0 {
		return errcode.NewInvalidInputErr(errors.New("not a normal user"))
	}
	if name != config.Gcp.String() && name != config.Aws.String() {
		return errcode.NewInvalidInputErr(errors.New("not supported cloud provider"))
	}

	return db.Transaction(func(tx *gorm.DB) error {
		provider := &entity.Provider{Name: config.Cloud(name), Status: entity.ProviderStatus(status)}
		err := provider.Create(tx)
		if err != nil {
			return err
		}
		return dbutil.AddAccessLogNow(tx, m.tenantAndUser.User.TenantID, m.tenantAndUser.Email, fmt.Sprintf("add new cloud provider %s", name))
	})
}

func (m UserContext) ListProviders() ([]Provider, error) {
	if m.tenantAndUser.ID == 0 {
		return nil, errcode.NewInvalidInputErr(errors.New("not a normal user"))
	}

	var providers []entity.Provider
	err := db.Transaction(func(tx *gorm.DB) error {
		return entity.NewProviderQuerySet(tx).All(&providers)
	})
	if err != nil {
		return nil, err
	}

	var ps []Provider
	for _, item := range providers {
		ps = append(ps, Provider{
			Name:   item.Name.String(),
			Status: string(item.Status),
		})
	}
	return ps, nil
}

func (m UserContext) GetProvidersCount() (int64, error) {
	var count int64 = 0

	err := db.Transaction(func(tx *gorm.DB) error {
		var err error
		count, err = entity.NewProviderQuerySet(tx).Count()

		return err
	})

	return count, err
}
