package backup

import (
	"context"
	"fmt"
	"os"
	"path/filepath"

	"github.com/aws/aws-sdk-go-v2/aws"
	"github.com/aws/aws-sdk-go-v2/config"
	"github.com/aws/aws-sdk-go-v2/credentials"
	"github.com/aws/aws-sdk-go-v2/service/s3"
)

func UploadParquetToSpaces(localFilePath, objectPath string) (string, error) {

	region := os.Getenv("DO_SPACES_REGION")
	endpoint := os.Getenv("DO_SPACES_ENDPOINT")
	bucket := os.Getenv("DO_SPACES_BUCKET")
	accessKey := os.Getenv("DO_SPACES_ACCESS_KEY")
	secretKey := os.Getenv("DO_SPACES_SECRET_KEY")

	cfg, err := config.LoadDefaultConfig(
		context.TODO(),
		config.WithRegion(region),
		config.WithCredentialsProvider(
			credentials.NewStaticCredentialsProvider(accessKey, secretKey, ""),
		),
		config.WithEndpointResolver(
			aws.EndpointResolverFunc(func(service, region string) (aws.Endpoint, error) {
				return aws.Endpoint{
					URL:           "https://" + endpoint,
					SigningRegion: region,
				}, nil
			}),
		),
	)
	if err != nil {
		return "", err
	}

	client := s3.NewFromConfig(cfg)

	file, err := os.Open(localFilePath)
	if err != nil {
		return "", err
	}
	defer file.Close()

	_, err = client.PutObject(context.TODO(), &s3.PutObjectInput{
		Bucket:      aws.String(bucket),
		Key:         aws.String(objectPath),
		Body:        file,
		ContentType: aws.String("application/octet-stream"),
		ACL:         "public-read",
	})
	if err != nil {
		return "", err
	}

	cdnURL := fmt.Sprintf(
		"https://images.nearle.app/%s",
		filepath.ToSlash(objectPath),
	)

	return cdnURL, nil
}
