package main

import (
	"context"
	"fmt"
	"os"
	"os/signal"
	"syscall"

	"github.com/AlchemyTelcoSolutions/callisto-so-bff/cmd/app"
	"github.com/AlchemyTelcoSolutions/callisto-so-bff/cmd/app/config"
	"github.com/AlchemyTelcoSolutions/xutils-go/xlogger"
)

func main() {
	ctx, stopFn := signal.NotifyContext(context.Background(), os.Interrupt, os.Kill, syscall.SIGTERM)
	defer stopFn()

	config := config.New()
	err := config.LoadConfigs()
	if err != nil {
		fmt.Printf("error setting up config | %v\n", err)
		os.Exit(1)
	}

	logger, err := xlogger.NewLogger(config.Logger.Level, xlogger.Config{
		LogOutputTo: []string{config.Logger.LogOutput},
		LoggErrsTo:  []string{config.Logger.ErrorOutput},
	}, make(map[string]interface{}))
	if err != nil {
		fmt.Printf("error setting up logger | %v\n", err)
		os.Exit(1)
	}

	a := app.NewApp(config, logger)
	err = a.InitClients(ctx)
	if err != nil {
		logger.Fatal("failed to initialize external clients", err)
	}

	err = a.Run(ctx)
	if err != nil && err != ctx.Err() {
		logger.Fatal("application stopped with error", err)
	}
	logger.Info("application stopped")
}
