package upload

import (
	"context"
	"io"
	"math/rand"

	"github.com/zhashkevych/s3-file-uploader/sidecar/filestorage"
)

const (
	letterBytes    = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
	fileNameLength = 16
)

type Uploader struct {
	fs *filestorage.FileStorage
}

func NewUploader(fs *filestorage.FileStorage) *Uploader {
	return &Uploader{
		fs: fs,
	}
}

func (u *Uploader) Upload(ctx context.Context, file io.Reader, size int64, contentType string) (string, error) {
	return u.fs.Upload(ctx, filestorage.UploadInput{
		File:        file,
		Name:        generateFileName(),
		Size:        size,
		ContentType: contentType,
	})
}

func generateFileName() string {
	b := make([]byte, fileNameLength)
	for i := range b {
		b[i] = letterBytes[rand.Intn(len(letterBytes))]
	}
	return string(b)
}
