package api

import (
	"context"

	ccent "github.com/tidbcloud/devops/entity/cloudconfig"
)

type ListTenantInitConfigurationsParam struct {
}

type ListTemplateParam struct {
	IDIn         []string
	NameIn       []string
	TemplateType string // custom/custom_part/default
	Version      string
	TenantID     string
}

type GetTemplateParam struct {
	WithDefaultCases bool
}

type ListTemplateDefaultCaseBindingsParam struct {
	ConfigTypeIs            *string
	DefaultForVersion       *string
	DefaultForCloudProvider *string
	DefaultForInstanceType  *string
	DefaultForTenantID      *string
	ExactMatch              bool

	Page    int32
	PerPage int32
}

type CreateTemplateParam struct {
	AllowAssignID   bool
	DenyPropagation bool
}

type DiffTemplateResult struct {
	ConfigType         string
	ModifiedParameters []ccent.ChangedParameter
}

type UpdateDefaultVersionParam struct {
	ForGlobal bool
	ForTenant *uint64
}

const (
	RegionModeAuto   = "auto"
	RegionModeAll    = "all"
	RegionModeSingle = "single"
)

type SearchClusterComponentsParam struct {
	TenantID         *uint64
	ClusterID        string
	ClusterType      ccent.ClusterType
	ComponentName    string
	ComponentVersion string
	ImageTag         string
	LogicalRegion    string
	RegionMode       string
	Page             int32
	PerPage          int32
}

type ConfigurationService interface {
	// Cluster Configuration
	GetClusterConfiguration(ctx context.Context, loc ccent.ClusterConfigurationLocator, mainComponent string) (*ccent.Configuration, error)

	// Tenant Init Configuration
	ListTenantInitConfigurations(ctx context.Context, param ListTenantInitConfigurationsParam) ([]*ccent.Configuration, error)
	GetTenantInitConfiguration(ctx context.Context, loc ccent.TenantInitConfigurationLocator) (*ccent.Configuration, error)
	GetTenantInitVersions(ctx context.Context, loc ccent.TenantInitConfigurationLocator) (*ccent.TenantVersions, error)
	ListTenantInitImages(ctx context.Context, loc ccent.TenantInitConfigurationLocator) (map[string]*ccent.Component, error)

	// Configuration Template
	ListTemplate(ctx context.Context, typ ccent.ClusterType, param ListTemplateParam) ([]*ccent.Template, error)
	GetTemplate(ctx context.Context, typ ccent.ClusterType, id uint64, param GetTemplateParam) (*ccent.Template, error)
	GetTemplateByDefaultCase(ctx context.Context, typ ccent.ClusterType, defcase ccent.TemplateDefaultCase) (*ccent.Template, error)
	CreateTemplate(ctx context.Context, template *ccent.Template, param CreateTemplateParam) (*ccent.Template, error)
	DiffTemplate(ctx context.Context, typ ccent.ClusterType, source, target uint64) (*DiffTemplateResult, error)
	ListTemplateDefaultCaseBindings(ctx context.Context, typ ccent.ClusterType, param ListTemplateDefaultCaseBindingsParam) ([]*ccent.TemplateDefaultCaseBinding, int64, error)
	UpdateTemplateDefaultCaseBinding(ctx context.Context, binding *ccent.TemplateDefaultCaseBinding) error
	DeleteTemplateDefaultCaseBinding(ctx context.Context, binding *ccent.TemplateDefaultCaseBinding) error
	BatchUpdateTemplateDefaultCaseBindings(ctx context.Context, bindings []*ccent.TemplateDefaultCaseBinding) error

	// Version
	ListAvailableComponentVersions(ctx context.Context, typ ccent.ClusterType, comp string) ([]string, error)
	SearchClusterComponents(ctx context.Context, param SearchClusterComponentsParam) (*ccent.ClusterComponentSearchResult, error)
	ListAvailableClusterVersions(ctx context.Context, typ ccent.ClusterType) ([]*ccent.AvailableClusterVersion, error)
	UpdateDefaultClusterVersion(ctx context.Context, typ ccent.ClusterType, version string, param UpdateDefaultVersionParam) error

	// Misc
	ListAvailableInstanceTypes(ctx context.Context, typ ccent.ClusterType, version, configType string) ([]*ccent.CloudInstanceType, error)
	UpdateDefaultComponents(ctx context.Context, comps []*ccent.DefaultComponentConfig) error
	GetDefaultComponent(ctx context.Context, defCase *ccent.ComponentDefaultCase) (*ccent.DefaultComponentConfig, error)
}
