package aws

import (
	"os"

	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/awsutil"
	"github.com/aws/aws-sdk-go/aws/credentials"
	"github.com/aws/aws-sdk-go/aws/session"
	"github.com/aws/aws-sdk-go/service/s3"
	log "github.com/rs/zerolog/log"

	//"net/http"
	"bytes"
	"encoding/base64"
)

func Upload(sb string, path string) (string, error) {

	aws_access_key_id := os.Getenv("AWS_ACCESS_KEY_ID")
	aws_secret_access_key := os.Getenv("AWS_SECRET_ACCESS_KEY")

	creds := credentials.NewStaticCredentials(aws_access_key_id, aws_secret_access_key, "")
	_, err := creds.Get()

	if err != nil {
		log.Error().Err(err).Msg(err.Error())
		return err.Error(), err
	}

	cfg := aws.NewConfig().WithRegion(os.Getenv("AWS_DEFAULT_REGION")).WithCredentials(creds)
	svc := s3.New(session.New(), cfg)

	buffer, errDec := base64.StdEncoding.DecodeString(sb)

	if errDec != nil {
		return errDec.Error(), errDec
	}

	fileBytes := bytes.NewReader(buffer)
	//fileType := http.DetectContentType(buffer)

	params := &s3.PutObjectInput{
		Bucket: aws.String(os.Getenv("AWS_BUCKET")),
		Key:    aws.String(path),
		Body:   fileBytes,
		//ContentLength: aws.Int64(int64(len(sb))),
		//ContentType: aws.String(fileType),
	}

	log.Print("Checking AWS Access")

	resp, _err_res := svc.PutObject(params)

	log.Print(_err_res)

	if _err_res != nil {
		log.Print(_err_res.Error())
		log.Print("AWS :Error Upload")
		return _err_res.Error(), _err_res
	}

	log.Print("response %s", awsutil.StringValue(resp))
	return awsutil.StringValue(resp), nil
}

func Get(path string) (string, error) {
	aws_access_key_id := os.Getenv("AWS_ACCESS_KEY_ID")
	aws_secret_access_key := os.Getenv("AWS_SECRET_ACCESS_KEY")

	creds := credentials.NewStaticCredentials(aws_access_key_id, aws_secret_access_key, "")
	_, err := creds.Get()

	if err != nil {
		log.Print(err.Error())
		return err.Error(), err
	}

	cfg := aws.NewConfig().WithRegion(os.Getenv("AWS_DEFAULT_REGION")).WithCredentials(creds)
	svc := s3.New(session.New(), cfg)

	params := &s3.GetObjectInput{
		Bucket: aws.String(os.Getenv("AWS_BUCKET")),
		Key:    aws.String(path),
	}

	log.Print("Checking AWS Access")

	resp, _err_res := svc.GetObject(params)

	log.Print(_err_res)
	buf := new(bytes.Buffer)
	_, err = buf.ReadFrom(resp.Body)
	if err != nil {
		return "", err
	}
	base64String := base64.StdEncoding.EncodeToString(buf.Bytes())
	log.Print(base64String)

	if _err_res != nil {
		log.Print(_err_res.Error())
		log.Print("AWS :Error Upload")
		return _err_res.Error(), _err_res
	}

	log.Print("response %s", awsutil.StringValue(resp))
	return base64String, nil
}
