package storage

import (
	"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"
)

type S3FileSystem struct {
	Config map[string]string
}

func (l S3FileSystem) ListFiles() ([]File, error) {

	s3Config := &aws.Config{
		Credentials:      credentials.NewStaticCredentials(l.Config["keyid"], l.Config["secret"], ""),
		Endpoint:         aws.String(l.Config["endpoint"]),
		Region:           aws.String(l.Config["region"]),
		S3ForcePathStyle: aws.Bool(true),
	}

	newSession, err := session.NewSession(s3Config)
	if err != nil {
		return nil, err
	}

	s3Client := s3.New(newSession)

	lc := s3.ListObjectsInput{
		Bucket:                   aws.String(l.Config["bucket"]),
		Delimiter:                nil,
		EncodingType:             nil,
		ExpectedBucketOwner:      nil,
		Marker:                   nil,
		MaxKeys:                  nil,
		OptionalObjectAttributes: nil,
		Prefix:                   aws.String(l.Config["prefix"]),
		RequestPayer:             nil,
	}
	objects, err := s3Client.ListObjects(&lc)
	if err != nil {
		return nil, err
	}

	fileList := []File{}

	for _, o := range objects.Contents {
		f := GeneralFile{
			name: *o.Key,
			time: *o.LastModified,
		}
		fileList = append(fileList, f)
	}

	return fileList, nil

}

func (I S3FileSystem) Delete(files []File) error {
	s3Config := &aws.Config{
		Credentials:      credentials.NewStaticCredentials(I.Config["keyid"], I.Config["secret"], ""),
		Endpoint:         aws.String(I.Config["endpoint"]),
		Region:           aws.String(I.Config["region"]),
		S3ForcePathStyle: aws.Bool(true),
	}

	newSession, err := session.NewSession(s3Config)
	if err != nil {
		return err
	}

	s3Client := s3.New(newSession)

	for _, f := range files {
		name, err := f.GetName()
		if err != nil {
			return err
		}

		doc := s3.DeleteObjectInput{
			Bucket:                    aws.String(I.Config["bucket"]),
			BypassGovernanceRetention: nil,
			ExpectedBucketOwner:       nil,
			Key:                       aws.String(name),
			MFA:                       nil,
			RequestPayer:              nil,
			VersionId:                 nil,
		}
		_, err = s3Client.DeleteObject(&doc)
		if err != nil {
			return err
		}
	}
	return nil
}
