package s3storage

import (
	"bytes"
	"context"
	"io"

	"github.com/aws/aws-sdk-go-v2/aws"
	s3api "github.com/aws/aws-sdk-go-v2/service/s3"
	log "github.com/sirupsen/logrus"
)

type S3Client struct {
	cli s3Client
	cfg aws.Config
}

type s3Client interface {
	GetObject(ctx context.Context, params *s3api.GetObjectInput, optFns ...func(*s3api.Options)) (*s3api.GetObjectOutput, error)
	PutObject(ctx context.Context, params *s3api.PutObjectInput, optFns ...func(*s3api.Options)) (*s3api.PutObjectOutput, error)
}

func NewS3(cfg aws.Config) S3Client {
	c := s3api.NewFromConfig(cfg)
	return S3Client{
		cli: c,
		cfg: cfg,
	}
}
func (s3 S3Client) Get(ctx context.Context, bucketName string, objectName string) (*io.ReadCloser, error) {
	out, err := s3.cli.GetObject(ctx, &s3api.GetObjectInput{
		Bucket: aws.String(bucketName),
		Key:    aws.String(objectName),
	})
	if err != nil {
		log.Errorf("wGetObject failed, err = %s", err.Error())
		return nil, err
	}
	return &out.Body, nil
}

func (s3 S3Client) Put(ctx context.Context, bucketName string, objectName string, reader *bytes.Reader) error {
	_, err := s3.cli.PutObject(ctx, &s3api.PutObjectInput{
		Bucket: aws.String(bucketName),
		Key:    aws.String(objectName),
		Body:   reader,
	})
	if err != nil {
		log.Errorf("PutObject failed, err = %s", err.Error())
		return err
	}

	return nil
}
