package models

import (
	"fmt"

	"github.com/tidbcloud/infra-provider/regional-server/api/v1alpha1"
	"github.com/tidbcloud/infra-provider/regional-server/pkg/common/constants"
)

type SharedBucketInfo struct {
	BucketName string `yaml:"bucketName"`

	*AWSSharedBucketInfo
	*GCPSharedBucketInfo
	*AzureSharedBucketInfo
}

type AWSSharedBucketInfo struct {
}

type GCPSharedBucketInfo struct {
}

type AzureSharedBucketInfo struct {
}

func (p SharedBucketInfo) Is(key string) bool {
	return p.BucketName == key
}

func (p SharedBucketInfo) GetKey() string {
	return p.BucketName
}

func (p SharedBucketInfo) GetSharedBucketReference(accountInfo DataPlaneAccountInfo, providerConfigName string) *v1alpha1.SharedBucketReference {
	bucketRef := &v1alpha1.SharedBucketReference{
		BucketName:         p.BucketName,
		ProviderConfigName: providerConfigName,
		AccountID:          accountInfo.GetAccountID(),
	}

	return bucketRef
}

type SharedBucketBindingTarget struct {
	TargetType constants.SharedBucketBindingTargetType `yaml:"targetType"`
	TargetKey  string                                  `yaml:"targetKey"`
}

func (a SharedBucketBindingTarget) UniqueTargetName() string {
	return fmt.Sprintf("sb-%s-%s", a.TargetType, a.TargetKey)
}

type ListSharedBucketOption interface {
	Apply(accounts []SharedBucketInfo) []SharedBucketInfo
}

type SharedBucketFilter struct {
}

func (a SharedBucketFilter) Apply(accounts []SharedBucketInfo) []SharedBucketInfo {
	results := make([]SharedBucketInfo, 0, len(accounts))
	for _, account := range accounts {
		_ = account
		results = append(results, account)
	}
	return results
}
