package s3

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

	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/credentials"
	"github.com/aws/aws-sdk-go/aws/session"
	"github.com/aws/aws-sdk-go/service/s3"
	"github.com/pingcap-inc/clinic/clinic_data_service/pkg/config"
)

func GetS3ClientWithGithubToken(region string, s3Bucket string) (*S3Client, error) {
	// if err := config.LoadConfig(); err != nil {
	// 	log.Fatalf("Failed to load configuration: %v", err)
	cfg := &config.AppConfig
	githubToken := cfg.S3.GithubToken
	creds, err := authenticate(githubToken, cfg.S3.AuthURL)
	if err != nil {
		return nil, fmt.Errorf("authentication failed: %v", err)
	}

	sess, err := session.NewSession(&aws.Config{
		Region: aws.String(region), // keep actual AWS region
		Credentials: credentials.NewStaticCredentials(
			creds.AccessKeyID,
			creds.SecretAccessKey,
			creds.SessionToken,
		),
	})
	if err != nil {
		return nil, fmt.Errorf("failed to create aws session: %v", err)
	}

	client := s3.New(sess)
	myS3Client := &S3Client{
		client: client,
		bucket: s3Bucket,
	}

	return myS3Client, nil

}

func UploadFileToS3(s3Client *S3Client, filePath string, s3KeyPrefix string) error {
	// 打开本地文件
	file, err := os.Open(filePath)
	if err != nil {
		return fmt.Errorf("failed to open file: %w", err)
	}
	defer file.Close()

	fileName := filepath.Base(filePath)
	s3Key := s3KeyPrefix + fileName
	// Upload the file to S3
	_, err = s3Client.client.PutObject(&s3.PutObjectInput{
		Bucket: aws.String(s3Client.bucket),
		Key:    aws.String(s3Key),
		Body:   file,
	})
	return err
}
