package infraapi

import (
	"context"

	corev1 "k8s.io/api/core/v1"
)

// CompactBackupStatus represents the status of a compact backup operation
type CompactBackupStatus string

const (
	CompactBackupStatusUnspecified CompactBackupStatus = "unspecified"
	CompactBackupStatusPending     CompactBackupStatus = "pending"
	CompactBackupStatusRunning     CompactBackupStatus = "running"
	CompactBackupStatusComplete    CompactBackupStatus = "complete"
	CompactBackupStatusFailed      CompactBackupStatus = "failed"
	CompactBackupStatusRetry       CompactBackupStatus = "retry"
)

// CreateCompactBackupParam defines parameters for creating a compact backup
type CreateCompactBackupParam struct {
	ClusterID uint64
	TenantID  uint64
	ProjectID uint64

	// CompactBackup specific parameters
	LogBackupID   uint64
	StartTS       *uint64
	EndTS         *uint64
	Concurrency   *uint32
	InstanceType  *string
	CleanPolicy   *string
	Configuration *CompactBackupConfiguration
	Storage       string // Storage location for compact backup
	// ShardCount enables sharded compaction mode when > 0.
	// When 0, the operator uses its own default (single-pod mode).
	ShardCount int

	// CompactBackupName is the pre-generated downstream CR name (compact-{entityID}).
	// Set by the model layer before the DAG starts to ensure idempotency.
	CompactBackupName string

	// Environment and resource configuration (similar to CreateBackupParam)
	Env                  []corev1.EnvVar
	ResourceRequirements *corev1.ResourceRequirements

	// Common parameters
	TagEnvironmentValue string
	TagComponentValue   string
}

// CompactBackupConfiguration defines configuration for compact backup
type CompactBackupConfiguration struct {
	BaseImage   string
	Tag         string
	Config      string
	TiKVImage   string
	TiKVVersion string
}

// CompactBackupResponse defines the response structure for compact backup operations
type CompactBackupResponse struct {
	CompactBackupId string
	ClusterId       uint64
	Status          CompactBackupStatus
	CreatedAt       string
	FinishedAt      string
	ErrorMessage    string
	Progress        string
	BackupPath      string
	Configuration   *CompactBackupConfiguration
}

// CompactFacade defines the interface for compact backup operations
type CompactFacade interface {
	CreateCompactBackupIgnoreExists(ctx context.Context, cloudProvider, region string, param *CreateCompactBackupParam) (*CompactBackupResponse, error)
	GetCompactBackup(ctx context.Context, cloudProvider, region string, tenantID uint64, projectID uint64, clusterID uint64, compactBackupID string) (*CompactBackupResponse, error)
	DeleteCompactBackupIgnoreNotFound(ctx context.Context, cloudProvider, region string, tenantID uint64, projectID uint64, clusterID uint64, compactBackupID string) error
}
