package main

import (
	"flag"
	"fmt"
	"log"
	"net/http"
	"time"

	"github.com/prometheus/client_golang/prometheus/promhttp"
	"github.com/robfig/cron/v3"
	"github.com/tidbcloud/observability/data-collector/pkg"
	"github.com/tidbcloud/observability/data-collector/pkg/processor"
)

func main() {
	var configpath string
	flag.StringVar(&configpath, "config", "./config/processor_config.yaml", "path to processor config files")
	flag.Parse()
	cfg := processor.NewConfig(configpath)
	region := cfg.Region
	bucket := cfg.Bucket
	evaBucket := cfg.EvaBucket
	dataSources := cfg.DataSources
	version := cfg.Version
	task := processor.NewTask(region)

	c := cron.New()
	_, err := c.AddFunc("15,45 * * * *", func() {
		task.CleanAndProcessData(bucket, dataSources, version)
	})
	if err != nil {
		panic(fmt.Errorf("add cron job failed: %w", err))
	}

	_, err = c.AddFunc("0 1 * * *", func() {
		task.MergeData(bucket, evaBucket, dataSources, version)
	})
	if err != nil {
		panic(fmt.Errorf("add cron job failed: %w", err))
	}

	_, err = c.AddFunc("20,50 * * * *", func() {
		task.JoinData(bucket, evaBucket, dataSources, version)
	})
	if err != nil {
		panic(fmt.Errorf("add cron job failed: %w", err))
	}
	c.Start()

	log.Println("start prometheus server")
	pkg.RegisterMetric()
	http.Handle("/metrics", promhttp.Handler())
	server := &http.Server{
		Addr:              ":8081",
		ReadHeaderTimeout: 3 * time.Second,
	}
	err = server.ListenAndServe()
	if err != nil {
		panic(fmt.Errorf("start metrics server failed: %w", err))
	}

}
