package account

import (
	"context"
	"time"

	"github.com/tidbcloud/account/idl/pbgen/proto/account"

	"github.com/tidbcloud/tidb-management-service/utilities/bizerr"
)

//go:generate go run go.uber.org/mock/mockgen@latest -source=$GOFILE -package=mock_$GOPACKAGE -destination=./mock_$GOPACKAGE/mock_$GOFILE
type Client interface {
	GetTenant(ctx context.Context, orgID uint64) (*TenantInfo, bizerr.BizError)
	QueryTenant(ctx context.Context, filter TenantFilter) (map[uint64]*TenantInfo, bizerr.BizError)
	GetProject(ctx context.Context, projectID uint64) (*ProjectInfo, bizerr.BizError)
	QueryProject(ctx context.Context, filter ProjectFilter) (map[uint64]*ProjectInfo, bizerr.BizError)
	GetClusterAuthPubKey(ctx context.Context, orgId, projectId, clusterId uint64) (string, bizerr.BizError)
	GetClusterInitialDelegateUsers(ctx context.Context, tenantID, projectID uint64) ([]*account.DBUser, bizerr.BizError)
}

type ProjectInfo struct {
	ID             uint64
	TenantID       uint64
	Name           string
	IsCrossAccount bool
	AwsCmekEnabled bool
	CreatedAt      time.Time
}

type TenantInfo struct {
	ID        uint64
	Name      string
	TimeZone  string
	CreatedAt time.Time
	Plan      string
}

type TenantFilter struct {
	TenantIDs []uint64
}

type ProjectFilter struct {
	TenantIDs  []uint64
	ProjectIDs []uint64
	Statuses   []string
}

const (
	TenantPlanNewUser   = "new_user"
	TenantPlanFreeTrial = "free_trial"
	TenantPlanPOC       = "poc"
	TenantPlanOnDemand  = "on_demand"
	ProjectStatusActive = "active"
)

func BuildOrgCreateTimeFetcher(accountCli Client) func(ctx context.Context, orgId uint64) (time.Time, bizerr.BizError) {
	return func(ctx context.Context, orgId uint64) (time.Time, bizerr.BizError) {
		orgInfo, err := accountCli.GetTenant(ctx, orgId)
		if err != nil {
			return time.Time{}, err
		}
		return orgInfo.CreatedAt, nil
	}
}
