package main

import (
	"context"
	"log"
	"net"
	"net/http"
	"os"
	"os/signal"
	"strconv"
	"syscall"

	server "git.slaventius.ru/test3k/auth/internal"
	"git.slaventius.ru/test3k/auth/internal/config"
)

func main() {
	config := config.NewConfig()
	ctx, ctxCancel := context.WithCancel(context.Background())
	srv := server.NewServer(ctx, config)

	//
	signalChannel := make(chan os.Signal, 1)
	signal.Notify(signalChannel, syscall.SIGINT)
	signal.Notify(signalChannel, syscall.SIGTERM)
	defer stop(signalChannel, srv, ctxCancel)

	// Запуск сервера
	go start(config, srv, ctxCancel)

	//
	for {
		select {
		case <-signalChannel:
			return
		case <-ctx.Done():
			return
		}
	}
}

// Остановка сервера
func stop(signalChannel chan os.Signal, srv *server.AuthServer, cancel context.CancelFunc) {
	defer srv.GracefulStop()
	defer signal.Stop(signalChannel)
	defer cancel()

	log.Println("authServer stopping ...")
}

// Запуск сервера
func start(config *config.Config, s *server.AuthServer, cancel context.CancelFunc) {
	defer cancel()

	//
	connStr := net.JoinHostPort("", strconv.Itoa(config.App.Port))

	//
	log.Printf("authServer starting (%s)\n", connStr)

	//
	err := http.ListenAndServe(connStr, s.Router) // router
	if err != nil {
		log.Fatal("Failed starting server")
	}
}