package api

import (
	"context"

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

type ListDefaultConfigurationChangesParam struct {
	ContainItemType *ccent.DefaultConfigurationChangeItemType

	Page    int
	PerPage int
}

type ListDefaultConfigurationChangeItemsParam struct {
	OwnByChange *uint64
	TypeIs      *ccent.DefaultConfigurationChangeItemType
	DataIs      *string
	IDIn        []uint64

	Page    int // 0 means no pagination
	PerPage int
}

type StatDefaultConfigurationChangeItemsParam struct {
	OwnByChange *uint64

	// special stat
	ConfigTypesOfTemplateDefaultCaseBinding bool
}

type StatDefaultConfigurationChangeItemsResult struct {
	ConfigTypesOfTemplateDefaultCaseBinding []string
}

type ReleaseVersionParam struct {
	ClusterType   ccent.ClusterType `json:"cluster_type"`
	SourceVersion string            `json:"source_version"`
	TargetVersion string            `json:"target_version"`
}

type CreateDefaultConfigurationChangeParam struct {
	Applicant   string
	Reason      string
	DisplayName string

	VersionRelease                   *ReleaseVersionParam                `json:"version_release"`
	TemplateDefaultCaseBindingChange []*ccent.TemplateDefaultCaseBinding `json:"template_default_case_binding_change"`
	DefaultComponentConfigChange     []*ccent.DefaultComponentConfig     `json:"default_component_change"`
}

type BatchUpdateTemplateParam struct {
	Items         []*ccent.TemplateDefaultCaseBindingChange `json:"items"`
	ParamsToSet   []ccent.NamedParameter                    `json:"params_to_set"`
	ParamsToUnset []string                                  `json:"params_to_unset"`
}

type BatchUpdateDefaultConfigurationChangeItemsParam struct {
	BatchUpdateTemplate     *BatchUpdateTemplateParam       `json:"batch_update_template,omitempty"`
	UpdateDefaultComponents []*ccent.DefaultComponentConfig `json:"update_default_components,omitempty"`
}

type ListDefaultConfigurationChangeReleasesParam struct {
	OwnByChange     *uint64
	EnvironmentIs   *string
	ReleaseNumberIs *uint64
}

type ListDefaultConfigurationChangeItemReleasesParam struct {
	OwnByChange     *uint64
	EnvironmentIs   *string
	ReleaseNumberIs *uint64
	LatestPerItem   bool
	ItemIDIn        []uint64
}

type DefaultConfigurationChangeService interface {
	GetDefaultConfigurationChange(ctx context.Context, cid uint64) (*ccent.DefaultConfigurationChange, error)
	ListDefaultConfigurationChanges(ctx context.Context, param ListDefaultConfigurationChangesParam) ([]*ccent.DefaultConfigurationChange, int64, error)
	CreateDefaultConfigurationChange(ctx context.Context, param CreateDefaultConfigurationChangeParam) (*uint64, error)
	CloseDefaultConfigurationChange(ctx context.Context, cid uint64, result ccent.DefaultConfigurationChangePhase, reason string) error

	GetDefaultConfigurationChangeReleases(ctx context.Context, rid uint64) (*ccent.DefaultConfigurationChangeRelease, error)
	ListDefaultConfigurationChangeReleases(ctx context.Context, param ListDefaultConfigurationChangeReleasesParam) ([]*ccent.DefaultConfigurationChangeRelease, error)
	CreateDefaultConfigurationChangeRelease(ctx context.Context, cid uint64, env string, description string) error
	RollbackDefaultConfigurationChangeRelease(ctx context.Context, cid uint64, env string, number uint64, description string) error
	CancelDefaultConfigurationChangeRelease(ctx context.Context, cid, releaseID uint64) error

	ListDefaultConfigurationChangeItems(ctx context.Context, param ListDefaultConfigurationChangeItemsParam) ([]*ccent.DefaultConfigurationChangeItem, int64, error)
	BatchUpdateDefaultConfigurationChangeItems(ctx context.Context, cid uint64, param BatchUpdateDefaultConfigurationChangeItemsParam) error
	StatDefaultConfigurationChangeItems(ctx context.Context, param StatDefaultConfigurationChangeItemsParam) (*StatDefaultConfigurationChangeItemsResult, error)

	ListDefaultConfigurationChangeItemReleases(ctx context.Context, param ListDefaultConfigurationChangeItemReleasesParam) ([]*ccent.DefaultConfigurationChangeItemRelease, error)
	SyncVersionsFromGitops(ctx context.Context, minVersion, maxVersion, gitopsBranch string) error
}
