package main

import (
	"context"
	"errors"
	"log"
	"os"
	"os/signal"
	"syscall"

	"github.com/nexuscrm/backend/internal/integrationservice"
)

var version = "dev"

func main() {
	config, err := integrationservice.LoadConfig(os.LookupEnv)
	if err != nil {
		log.Fatal(err)
	}
	signalCtx, stopSignals := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM)
	defer stopSignals()
	startupCtx, cancelStartup := context.WithTimeout(signalCtx, config.RuntimeStartupTimeout)
	process, err := integrationservice.AssembleProduction(startupCtx, version, config)
	if err != nil {
		cancelStartup()
		log.Fatal(err)
	}
	if err := process.Start(startupCtx); err != nil {
		cancelStartup()
		log.Fatal(err)
	}
	cancelStartup()
	log.Printf("integration service started: address=%s", process.Address())
	serveResult := make(chan error, 1)
	go func() { serveResult <- process.Wait() }()
	var serveErr error
	select {
	case <-signalCtx.Done():
	case serveErr = <-serveResult:
	}
	shutdownCtx, cancel := context.WithTimeout(context.Background(), config.ShutdownTimeout)
	defer cancel()
	shutdownErr := process.Shutdown(shutdownCtx)
	if err := errors.Join(serveErr, shutdownErr); err != nil {
		log.Fatal(err)
	}
}
