package main

import (
	"log"
	"os"
	"os/signal"
	"syscall"
	"th7/config"
	"th7/core"
	"th7/db"
	"th7/pcb"
	"th7/ports"
	"th7/web"
)

func main() {

	var pcbPort ports.PCBPort
	var corePort ports.CorePort
	var dbPort ports.DBPort
	var webPort ports.WebPort
	var err error

	kill := make(chan os.Signal, 1)
	signal.Notify(kill,
		syscall.SIGTERM,
		syscall.SIGINT,
		syscall.SIGHUP,
		syscall.SIGQUIT)

	cfg, err := config.Load()
	if err != nil {
		log.Fatalf("Error loading config: %v", err)
	}

	pcbPort, err = pcb.NewAdapter(cfg)
	if err != nil {
		log.Fatalf("Fatal error: %v\n", err)
	}
	defer pcbPort.Deinit()

	corePort, err = core.NewAdapter(pcbPort, cfg)
	if err != nil {
		log.Fatalf("Error starting TH7 Adapter: %v\n", err)
	}

	dbPort, err = db.NewAdapter(corePort, cfg)
	if err != nil {
		log.Fatalf("Fatal error: %v\n", err)
	}
	defer dbPort.Close()

	webPort = web.NewGinAdapter(corePort, cfg)
	go webPort.Run()

	sig := <-kill
	log.Printf("Caught signal %v", sig)
}