package main

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

	server "git.slaventius.ru/test3k/authDB/internal"
	"git.slaventius.ru/test3k/authDB/internal/config"
	api "git.slaventius.ru/test3k/umate/pkg/api"

	"google.golang.org/grpc"
)

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

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

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

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

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

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

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

	//
	api.RegisterAuthDBServer(s, srv)

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

	//
	lis, era := net.Listen("tcp", connStr)
	if era != nil {
		log.Fatal(era)
	}

	//
	log.Printf("authDBServer starting on %s\n", connStr)
	log.Printf("authDBServer listening on %s\n", kafkaStr)

	//
	eru := s.Serve(lis)
	if eru != nil {
		log.Fatal("Failed starting server")
	}
}