package main

import (
	"context"
	"log"
	"os"
	"os/signal"
	"time"

	"github.com/gorilla/mux"

	"github.com/rjNemo/go-micro/products/handlers"
	"github.com/rjNemo/go-micro/products/server"
)

const port = ":5000"
const productPath = "/products"

// allowed consumers. Use "*" for public API only.
var origins = []string{"http://localhost:3000"}

func main() {
	// create a logger to control application wide logging
	logger := log.New(os.Stdout, "Product API: ", log.LstdFlags|log.Lshortfile)

	// create a router
	router := mux.NewRouter()

	// create the handler
	productsHandler := handlers.New(logger)

	// register the handler method to the router
	productsHandler.RegisterRoutes(router, productPath)

	// creates a production-ready server using the handler
	srv := server.New(router, port, origins)

	// start a non blocking application server
	go func() {
		logger.Printf("Server started at http://localhost%s ...", port)
		logger.Fatalf("Server failed: %v", srv.ListenAndServe()) // TODO: use ListenAndServeTLS in production
	}()

	// catch sigterm or interrupt and gracefully terminates the server
	sigChan := make(chan os.Signal)
	signal.Notify(sigChan, os.Interrupt) // interrupt
	signal.Notify(sigChan, os.Kill)      // sigterm
	// log received signal
	sig := <-sigChan
	logger.Printf("Received %v signal... graceful shutdown", sig)

	toCtx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
	cancel()
	srv.Shutdown(toCtx)
}
