package adapter

import (
	"context"
	"time"

	"github.com/tidbcloud/tidb-management-service/serverless-global-service/domain/entity"
)

type Sys9CreateClusterResult struct {
	ServiceInstanceID string
	OperationID       string
}

type Sys9Operation struct {
	OperationID string
	Phase       string
	ResourceID  string
}

type Sys9ManagedDatabaseConnectionInfo struct {
	Host string
	Port int32
}

type Sys9ManagedDatabaseBackup struct {
	BackupID   string
	BackupName string
	BackupTime time.Time
	State      string
	Expiration *time.Time
}

type Sys9ListManagedDatabaseBackupsRequest struct {
	LastBackupTime *time.Time
	MaxCount       uint32
	PageToken      string
}

type Sys9ListManagedDatabaseBackupsResponse struct {
	Items         []*Sys9ManagedDatabaseBackup
	HasMore       bool
	NextPageToken string
}

type Sys9ManagedDatabaseBackupPolicy struct {
	Enabled       bool
	Schedule      string
	RetentionDays uint32
}

//go:generate go run go.uber.org/mock/mockgen@latest -source=$GOFILE -package=mock_$GOPACKAGE -destination=./mock_$GOPACKAGE/mock_$GOFILE
type Sys9Lifecycle interface {
	CreateCluster(ctx context.Context, cluster *entity.Cluster) (*Sys9CreateClusterResult, error)
	GetOperation(ctx context.Context, cluster *entity.Cluster, operationID string) (*Sys9Operation, error)
	DeleteCluster(ctx context.Context, cluster *entity.Cluster, serviceInstanceID string) error
	GetManagedDatabaseConnectionInfo(
		ctx context.Context,
		cluster *entity.Cluster,
		serviceInstanceID string,
	) (*Sys9ManagedDatabaseConnectionInfo, error)
	RotateManagedDatabaseAdministrativeCredential(
		ctx context.Context,
		cluster *entity.Cluster,
		serviceInstanceID string,
		operationToken string,
	) (string, error)
	RedeemManagedDatabaseAdministrativeCredential(
		ctx context.Context,
		cluster *entity.Cluster,
		serviceInstanceID string,
		operationToken string,
	) (string, error)
	CreateManagedDatabaseBackup(
		ctx context.Context,
		cluster *entity.Cluster,
		serviceInstanceID string,
	) (string, error)
	ListManagedDatabaseBackups(
		ctx context.Context,
		cluster *entity.Cluster,
		serviceInstanceID string,
		req *Sys9ListManagedDatabaseBackupsRequest,
	) (*Sys9ListManagedDatabaseBackupsResponse, error)
	GetManagedDatabaseBackup(
		ctx context.Context,
		cluster *entity.Cluster,
		serviceInstanceID string,
		backupID string,
	) (*Sys9ManagedDatabaseBackup, error)
	GetManagedDatabaseBackupPolicy(
		ctx context.Context,
		cluster *entity.Cluster,
		serviceInstanceID string,
	) (*Sys9ManagedDatabaseBackupPolicy, error)
	UpdateManagedDatabaseBackupPolicy(
		ctx context.Context,
		cluster *entity.Cluster,
		serviceInstanceID string,
		policy *Sys9ManagedDatabaseBackupPolicy,
	) (*Sys9ManagedDatabaseBackupPolicy, error)
}
