package main

import (
	"flag"
	"log"
	"net/http"
	_ "net/http/pprof"
	"os"
	"strings"
	"time"

	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/session"
	"github.com/aws/aws-sdk-go/service/s3"
	"github.com/filtr/go-apollo/pkg/spotifyconsumeranalytics"
)

var (
	inputStartDate    string
	inputEndDate      string
	inputReport       string
	inputLicensor     string
	inputCountryCode  string
	inputSourceRegion string
	inputTargetRegion string
	inputSourceBucket string
	inputTargetBucket string
	host              string
)

func init() {
	defaultStartDate := time.Now().AddDate(0, 0, -11).Format("2006-01-02")
	defaultEndDate := time.Now().AddDate(0, 0, -1).Format("2006-01-02")
	flag.StringVar(&inputStartDate, "startdate", defaultStartDate, "Start Date")
	flag.StringVar(&inputEndDate, "enddate", defaultEndDate, "End Date")
	flag.StringVar(&inputReport, "report", "", "Report")
	flag.StringVar(&inputLicensor, "licensor", "smej,smejintl,theorchard,sony", "Licensor")
	flag.StringVar(&inputCountryCode, "countrycode", "", "Country Code")
	flag.StringVar(&inputSourceRegion, "source-region", "", `AWS source region. env: AWS_SOURCE_REGION`)
	flag.StringVar(&inputTargetRegion, "target-region", "", `AWS target region. env: AWS_TARGET_REGION`)
	flag.StringVar(&inputSourceBucket, "source-bucket", "", `source S3 bucket. env: AWS_SOURCE_BUCKET`)
	flag.StringVar(&inputTargetBucket, "target-bucket", "", `target S3 bucket. env: AWS_TARGET_BUCKET`)
	flag.StringVar(&host, "debug-server-host", "localhost:6063", `host for debug server`)
}

func main() {
	log.Println("Spotify Consumer Analytics task started")
	defer log.Println("Spotify Consumer Analytics task finished")

	flag.Parse()
	if inputSourceRegion == "" {
		if inputSourceRegion = os.Getenv("AWS_SOURCE_REGION"); inputSourceRegion == "" {
			log.Fatal("aws source region is not set")
		}
	}
	if inputTargetRegion == "" {
		if inputTargetRegion = os.Getenv("AWS_TARGET_REGION"); inputTargetRegion == "" {
			log.Fatal("aws target region is not set")
		}
	}
	if inputSourceBucket == "" {
		if inputSourceBucket = os.Getenv("AWS_SOURCE_BUCKET"); inputSourceBucket == "" {
			log.Fatal("aws s3 source bucket is not set")
		}
	}
	if inputTargetBucket == "" {
		if inputTargetBucket = os.Getenv("AWS_TARGET_BUCKET"); inputTargetBucket == "" {
			log.Fatal("aws s3 target bucket is not set")
		}
	}
	log.Printf("source region: %s, target region: %s, source bucket: %s, target bucket: %s", inputSourceRegion, inputTargetRegion, inputSourceBucket, inputTargetBucket)
	s3SourceService := s3.New(
		session.New(),
		&aws.Config{
			Region:          aws.String(inputSourceRegion),
			S3UseAccelerate: aws.Bool(false),
		},
	)
	if s3SourceService == nil {
		log.Fatalln("failed to establish connection to S3")
	}
	s3TargetService := s3.New(
		session.New(),
		&aws.Config{
			Region:          aws.String(inputTargetRegion),
			S3UseAccelerate: aws.Bool(false),
		},
	)
	if s3TargetService == nil {
		log.Fatalln("failed to establish connection to S3")
	}
	if inputStartDate > inputEndDate {
		log.Fatalln("startdate cannot be greater than enddate")
	}

	startDate, err := time.Parse(time.RFC3339, inputStartDate+"T00:00:00Z")
	if err != nil {
		log.Fatal(err)
	}
	endDate, err := time.Parse(time.RFC3339, inputEndDate+"T00:00:00Z")
	if err != nil {
		log.Fatal(err)
	}

	licensors := strings.Split(inputLicensor, ",")

	var countryCodes []string
	if inputCountryCode != "" {
		countryCodes = strings.Split(inputCountryCode, ",")
	}

	if host != "" {
		go func() {
			log.Println(http.ListenAndServe(host, nil))
		}()
	}

	switch inputReport {
	case "streams":
		spotifyconsumeranalytics.RunStreams(s3SourceService, s3TargetService, startDate, endDate, licensors, countryCodes, inputSourceBucket, inputTargetBucket)
	case "aggregatedstreams":
		spotifyconsumeranalytics.RunAggregatedStreams(s3SourceService, s3TargetService, startDate, endDate, licensors, inputSourceBucket, inputTargetBucket)
	case "all":
		spotifyconsumeranalytics.RunAggregatedStreams(s3SourceService, s3TargetService, startDate, endDate, licensors, inputSourceBucket, inputTargetBucket)
		spotifyconsumeranalytics.RunStreams(s3SourceService, s3TargetService, startDate, endDate, licensors, countryCodes, inputSourceBucket, inputTargetBucket)
	}
}
