package main

import (
	"fmt"
	"log"
	"os"
	"os/signal"
	"primesys_email/src/config"
	"primesys_email/src/cron"
	"primesys_email/src/db"
	"primesys_email/src/logger"
	"primesys_email/src/mail"
	"syscall"

	"github.com/joho/godotenv"
)

func main() {
	fmt.Println("Email Server started")

	if err := godotenv.Load(); err != nil {
		log.Fatal("Env load error")
	}

	cfg := config.Load()

	// every logger line is also written to this file in the project root
	logFile, err := os.OpenFile("report_email.log", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
	if err != nil {
		log.Fatalf("Log file open failed : %v", err)
	}
	defer logFile.Close()
	logger.SetFileOutput(logFile)

	if err := db.DBConnect(cfg.MongoURL, cfg.MongoDBName); err != nil {
		log.Fatalf("Mongo DB connection failed : %v", err)
	}
	defer db.Disconnect()

	// err = services.QueueDailyReports(context.Background())
	// if err != nil {
	// 	logger.Error("Queue error")
	// }

	// count, err := repositories.ConvertSentAtToEpoch(context.Background(), 1791916200)

	// if err != nil {
	// 	logger.Error("its error")
	// }

	// logger.Info("count of %d", count)

	sender := &mail.DynamicMailSender{}

	// if err := services.DivisionEmailDelivery(context.Background(), cfg.ProdURL, sender); err != nil {
	// 	logger.Error("Hourly delivery cron failed : %v", err)
	// 	return
	// }

	// divisionIds := []string{}

	// count, err := repositories.DeleteReportEmailQueueByReportDate(context.Background(), 1791916200)
	// if err != nil {
	// 	logger.Error("Error %v", err)
	// }

	// logger.Info("reports deleted %d", count)

	// for _, divId := range divisionIds {
	// 	err := repositories.DeleteReportEmailQueueByID(context.Background(), divId)

	// 	if err != nil {
	// 		logger.Error("Error %v", err)
	// 	}
	// }

	// queue job every day at 12:05 AM, delivery job every hour
	// error alert mail disabled for now, pass the notifier below instead of nil to enable it again
	// notifier := alert.New(cfg.AlertSMTPHost, cfg.AlertFrom, cfg.AlertPassword, cfg.AlertTo)

	scheduler, err := cron.Start(cfg.ProdURL, sender, cfg.RunDeliveryOnStart, nil)
	if err != nil {
		log.Fatalf("Cron start failed : %v", err)
	}

	quit := make(chan os.Signal, 1)
	signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
	<-quit

	log.Println("Shutting down, waiting for running jobs")
	<-scheduler.Stop().Done()
}
