package v1

import (
	"fmt"
	"net/url"

	"k8s.io/apimachinery/pkg/types"
	"k8s.io/apimachinery/pkg/util/validation/field"
)

func (b *Backup) GetClusterRef() types.NamespacedName {
	return types.NamespacedName{
		Namespace: b.Namespace,
		Name:      b.Spec.ClusterName,
	}
}

func (b *Backup) IsLogBackup() bool {
	if b.Spec.Mode == nil {
		return false
	}
	return *b.Spec.Mode == BackupModeLog
}

func (b *Backup) LogBackupStarted() bool {
	return b.IsLogBackup() && b.Status.BackupTS != ""
}

func (b *Backup) InLogBackupStopCommand() bool {
	return b.IsLogBackup() && b.Spec.LogStop != nil && *b.Spec.LogStop
}

func (b *Backup) InLogBackupTruncateCommand() bool {
	return b.IsLogBackup() && b.Spec.LogTruncateUntil != nil && *b.Spec.LogTruncateUntil != ""
}

func (b *Backup) LogBackupStopped() bool {
	return b.IsLogBackup() && b.Status.Phase == BackupStopped
}

func (b *Backup) GetRegion() string {
	return b.Labels[RegionLabel]
}

func validateStorage(providerType string, storage string) *field.Error {
	uri, err := url.Parse(storage)
	if err != nil {
		return field.Invalid(field.NewPath("backup").Child("spec").Child("storage"), storage,
			fmt.Sprintf("parameter storage %s parse failed: %s", storage, err))
	}

	if len(uri.Host) == 0 || (providerType == ProviderGCP && uri.Scheme != "gs") {
		return field.Invalid(field.NewPath("backup").Child("spec").Child("storage"), storage,
			fmt.Sprintf("parameter storage %s invalid in provider %s", storage, providerType))
	}
	return nil
}

func (b *Backup) IsFinished() bool {
	return b.Status.Phase == BackupFailed || b.Status.Phase == BackupComplete || b.Status.Phase == BackupStopped
}
