//go:generate ${GOBIN}/mockgen -destination api_mock.go -package=operation ${GO_MODULE}/pkg/service/operation OperationServiceAPI
package operation

import (
	"context"

	opent "github.com/tidbcloud/devops/entity/operation"
	"github.com/tidbcloud/devops/pkg/service/operation/instance"
)

type PreviewInstanceResult struct {
	Advisories []opent.Advisory
}

type ListInstanceParam struct {
	Type          *opent.OperationTarget
	CreateBefore  *int64
	CreateAfter   *int64
	TargetIDsIn   []string
	Phases        []opent.InstancePhase
	PhasesNot     []opent.InstancePhase
	Applicants    []string
	Operations    []string
	ParamSearches map[opent.ParamName]string

	Page    int // default 1
	PerPage int // default 20
}

func (l ListInstanceParam) Normalize() (ListInstanceParam, error) {
	if l.Page < 0 {
		l.Page = 1
	}
	if l.PerPage < 0 {
		l.PerPage = 20
	}

	return l, nil
}

type ListOperationParam struct {
	Target     *opent.OperationTarget
	Categories []string
}

type GetOperationParam struct {
	InjectParam bool
	TargetType  *opent.OperationTarget
	TargetID    *string
	ServicePlan *string
}

type CreateInstanceParam instance.CreateInstanceParam

type UpdateInstanceParam instance.UpdateInstanceParam

type OperationServiceAPI interface {
	ListInstances(ctx context.Context, param ListInstanceParam) ([]*opent.Instance, int64, error)
	GetInstance(ctx context.Context, id uint64) (*opent.Instance, error)
	CreateInstance(ctx context.Context, param CreateInstanceParam) (*uint64, error)
	PreviewInstance(ctx context.Context, param CreateInstanceParam) (*PreviewInstanceResult, error)
	SubmitInstance(ctx context.Context, id uint64) error
	UpdateInstance(ctx context.Context, id uint64, param UpdateInstanceParam) error
	CancelInstance(ctx context.Context, id uint64) error

	StartInstanceAction(ctx context.Context, id uint64, order opent.ActionOrder, operatorEmail string) error
	FinishInstanceAction(ctx context.Context, id uint64, order opent.ActionOrder, result opent.ActionStatus, output string) error

	ListOperations(ctx context.Context, param ListOperationParam) ([]*opent.Operation, error)
	GetOperation(ctx context.Context, name string, param GetOperationParam) (*opent.Operation, error)
	ListOperationCategories(ctx context.Context) ([]string, error)

	ListActions(ctx context.Context) ([]*opent.ActionMetadata, error)
	GetAction(ctx context.Context, name opent.ActionName) (*opent.ActionMetadata, error)

	// GetOperationClusterWhiteListInfo is a temp api for restart dm pod
	GetOperationClusterWhiteListInfo(ctx context.Context, clusterID string) (string, error)
}
