package config

import (
	"fmt"

	"github.com/tidbcloud/aws-shared-provider/pkg/types"
)

type AuditLogConfig struct {
	Env               string
	O11yBucketName    string
	Region            string
	RdsSecretArn      string
	CloudProviderType string
	RdsSecretRegion   string
	// used to build worker
	WorkerNs   string
	Image      string
	BucketName string
}

func (c AuditLogConfig) Check() error {
	if c.BucketName == "" {
		return fmt.Errorf("bucket name is required")
	}
	if c.Region == "" {
		return fmt.Errorf("region is required")
	}
	if c.O11yBucketName == "" {
		return fmt.Errorf("o11y bucket name is required")
	}
	if c.Env == "" {
		return fmt.Errorf("env is required")
	}
	if c.RdsSecretArn == "" {
		return fmt.Errorf("rds secret arn is required")
	}
	if c.WorkerNs == "" {
		return fmt.Errorf("worker ns is required")
	}
	if c.Image == "" {
		return fmt.Errorf("image is required")
	}
	if c.CloudProviderType != types.ProviderTypeAWSFreeTier &&
		c.CloudProviderType != types.ProviderTypeAliCloudFreeTier {
		return fmt.Errorf("unsupported cloud provider type")
	}
	return nil
}

type AuditLogWorkerConfig struct {
	TaskIds           []string
	Env               string
	O11yBucketName    string
	RdsSecretArn      string
	BucketName        string
	Region            string
	WorkerName        string
	CloudProviderType string
	RdsSecretRegion   string
}

func (c AuditLogWorkerConfig) Check() error {
	if len(c.TaskIds) == 0 {
		return fmt.Errorf("task ids is required")
	}
	if c.BucketName == "" {
		return fmt.Errorf("bucket name is required")
	}
	if c.Env == "" {
		return fmt.Errorf("env is required")
	}
	if c.O11yBucketName == "" {
		return fmt.Errorf("o11y bucket name is required")
	}
	if c.RdsSecretArn == "" {
		return fmt.Errorf("rds secret arn is required")
	}
	if c.Region == "" {
		return fmt.Errorf("region is required")
	}
	if c.WorkerName == "" {
		return fmt.Errorf("worker name is required")
	}
	if c.CloudProviderType != types.ProviderTypeAWSFreeTier &&
		c.CloudProviderType != types.ProviderTypeAliCloudFreeTier {
		return fmt.Errorf("unsupported cloud provider type")
	}
	return nil
}

func GetO11yAuditLogPrefix(
	env,
	orgID,
	projectID,
	clusterID,
	bucket,
	cloudProviderType string,
) string {
	if cloudProviderType == types.ProviderTypeAliCloudFreeTier {
		// ali OSS has an extra folder(bukcet name) in the path
		return fmt.Sprintf("%s/0/%s-devtier/auditlog/%s/%s/%s/",
			bucket,
			env,
			orgID,
			projectID,
			clusterID)
	}
	return fmt.Sprintf("0/%s-devtier/auditlog/%s/%s/%s/", env, orgID, projectID, clusterID)
}
