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
	inputDBAddress string
	inputLicensor  string
	inputRegion    string
	inputBucket    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(&inputLicensor, "licensor", "smej,smejintl,theorchard,sony", "Licensor")
	flag.StringVar(&inputDBAddress, "db-address", "", "Database Address")
	flag.StringVar(&inputRegion, "region", "", `AWS region. env: AWS_REGION`)
	flag.StringVar(&inputBucket, "bucket", "", `S3 bucket. env: AWS_BUCKET`)
	flag.StringVar(&host, "debug-server-host", "localhost:6064", `host for debug server`)
}

func main() {
	flag.Parse()
	if inputRegion == "" {
		if inputRegion = os.Getenv("AWS_REGION"); inputRegion == "" {
			log.Fatal("aws region is not set")
		}
	}
	if inputBucket == "" {
		if inputBucket = os.Getenv("AWS_BUCKET"); inputBucket == "" {
			log.Fatal("aws s3 bucket is not set")
		}
	}
	log.Printf("aws-region: %s, bucket: %s", inputRegion, inputBucket)
	s3Service := s3.New(
		session.New(),
		&aws.Config{
			Region:          aws.String(inputRegion),
			S3UseAccelerate: aws.Bool(true),
		},
	)
	if s3Service == 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, ",")

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

	spotifyconsumeranalytics.IngestStreams(s3Service, startDate, endDate, licensors, inputDBAddress, inputBucket)
}
