package processor

import (
	s3api "github.com/aws/aws-sdk-go-v2/service/s3"
	"golang.org/x/net/context"
)

type s3Client interface {
	ListObjects(ctx context.Context, params *s3api.ListObjectsInput, optFns ...func(*s3api.Options)) (*s3api.ListObjectsOutput, error)
	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)
}

type S3 interface {
	UploadFile(fn string, bucket string, key string) error
	DownloadFiles(bucket string, prefix string) (map[string]*s3api.GetObjectOutput, error)
}

type Processor interface {
	CleanData(bucket string, dir string, dataSource string, version string) error
	ProcessCleanedData(readDir string, writeDir string, dataSource string, version string) error
	MergeProcessedData(bucket string, writeDir string, dataSource string, version string) error
	JoinCleanedData(readDir string, writeDir string, dataSource string, version string) error
	GenerateDB(bucket string, dir string, dataSource string, version string) error
	UploadProcessedData(bucket string, dir string, dataSource string, version string) error
	UploadMergedData(bucket string, dir string, dataSource string, version string) error
	UploadJoinedData(bucket string, dir string, dataSource string, version string) error
	UploadConstructedDB(bucket string, dir string, dataSource string, version string) error
}

type Task interface {
	CleanAndProcessData(bucket string, dataSources []string, version string)
	MergeData(bucket string, evaBucket string, dataSources []string, version string)
	JoinData(bucket string, evaBucket string, dataSources []string, version string)
}
