package aws
import (
	"context"
	"fmt"
	"github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkinsio/v1alpha1"
	"github.com/jenkinsci/kubernetes-operator/pkg/controller/jenkins/configuration/base/resources"
	"github.com/jenkinsci/kubernetes-operator/pkg/controller/jenkins/constants"
	"github.com/jenkinsci/kubernetes-operator/pkg/controller/jenkins/plugins"
	"github.com/jenkinsci/kubernetes-operator/pkg/log"
	"github.com/go-logr/logr"
	corev1 "k8s.io/api/core/v1"
	"k8s.io/apimachinery/pkg/types"
	k8s "sigs.k8s.io/controller-runtime/pkg/client"
)
// AmazonS3Backup is a backup strategy where backup is stored in AWS S3 bucket
// credentials required to make calls to AWS API are provided by user in backup credentials Kubernetes secret
type AmazonS3Backup struct{}
// GetRestoreJobXML returns Jenkins restore backup job config XML
func (b *AmazonS3Backup) GetRestoreJobXML(jenkins v1alpha1.Jenkins) (string, error) {
	return `
  
  
  false
  
    
    
  
  
    
    false
  
  
  false
`, nil
}
// GetBackupJobXML returns Jenkins backup job config XML
func (b *AmazonS3Backup) GetBackupJobXML(jenkins v1alpha1.Jenkins) (string, error) {
	return `
  
  
  false
  
    
    
    
      
        
          H/60 * * * *
        
      
    
  
  
    
    false
  
  
  false
`, nil
}
// IsConfigurationValidForBasePhase validates if user provided valid configuration of backup for base phase
func (b *AmazonS3Backup) IsConfigurationValidForBasePhase(jenkins v1alpha1.Jenkins, logger logr.Logger) bool {
	if len(jenkins.Spec.BackupAmazonS3.BucketName) == 0 {
		logger.V(log.VWarn).Info("Bucket name not set in 'spec.backupAmazonS3.bucketName'")
		return false
	}
	if len(jenkins.Spec.BackupAmazonS3.BucketPath) == 0 {
		logger.V(log.VWarn).Info("Bucket path not set in 'spec.backupAmazonS3.bucketPath'")
		return false
	}
	if len(jenkins.Spec.BackupAmazonS3.Region) == 0 {
		logger.V(log.VWarn).Info("Region not set in 'spec.backupAmazonS3.region'")
		return false
	}
	return true
}
// IsConfigurationValidForUserPhase validates if user provided valid configuration of backup for user phase
func (b *AmazonS3Backup) IsConfigurationValidForUserPhase(k8sClient k8s.Client, jenkins v1alpha1.Jenkins, logger logr.Logger) (bool, error) {
	backupSecretName := resources.GetBackupCredentialsSecretName(&jenkins)
	backupSecret := &corev1.Secret{}
	err := k8sClient.Get(context.TODO(), types.NamespacedName{Namespace: jenkins.Namespace, Name: backupSecretName}, backupSecret)
	if err != nil {
		return false, err
	}
	if len(backupSecret.Data[constants.BackupAmazonS3SecretSecretKey]) == 0 {
		logger.V(log.VWarn).Info(fmt.Sprintf("Secret '%s' doesn't contains key: %s", backupSecretName, constants.BackupAmazonS3SecretSecretKey))
		return false, nil
	}
	if len(backupSecret.Data[constants.BackupAmazonS3SecretAccessKey]) == 0 {
		logger.V(log.VWarn).Info(fmt.Sprintf("Secret '%s' doesn't contains key: %s", backupSecretName, constants.BackupAmazonS3SecretAccessKey))
		return false, nil
	}
	return true, nil
}
// GetRequiredPlugins returns all required Jenkins plugins by this backup strategy
func (b *AmazonS3Backup) GetRequiredPlugins() map[string][]plugins.Plugin {
	return map[string][]plugins.Plugin{
		"aws-java-sdk:1.11.457": {
			plugins.Must(plugins.New(plugins.ApacheComponentsClientPlugin)),
			plugins.Must(plugins.New(plugins.Jackson2ADIPlugin)),
		},
	}
}