package grace

import (
	"context"
	"fmt"
	"os"
	"os/signal"
	"syscall"

	"go.uber.org/zap"
)

// NewGracefulContext returns grace context that cancelled by sigint,
// sigterm and sighup.
func NewGracefulContext(l *zap.Logger) context.Context {
	ctx, cancel := context.WithCancel(context.Background())

	go func() {
		ch := make(chan os.Signal, 1)
		signal.Notify(ch, syscall.SIGINT, syscall.SIGTERM, syscall.SIGHUP)
		sig := <-ch
		if l != nil {
			l.Info("received signal",
				zap.String("signal", sig.String()))
		} else {
			fmt.Printf("received signal %s\n", sig)
		}
		cancel()
	}()

	return ctx
}