package api

import (
	"context"
	"time"

	"github.com/gofiber/fiber/v2"
)

type Server struct {
	app             *fiber.App
	shutdownTimeout time.Duration
}

type ServerOption func(*Server)

const defaultShutdownTimeout = 30 * time.Second

func WithShutdownTimeout(timeout time.Duration) ServerOption {
	return func(s *Server) {
		if timeout > 0 {
			s.shutdownTimeout = timeout
		}
	}
}

func NewServer(app *fiber.App, opts ...ServerOption) *Server {
	srv := &Server{
		app:             app,
		shutdownTimeout: defaultShutdownTimeout,
	}
	for _, opt := range opts {
		if opt != nil {
			opt(srv)
		}
	}
	return srv
}

func (s *Server) Start(addr string) error {
	return s.app.Listen(addr)
}

func (s *Server) Shutdown(ctx context.Context) error {
	if ctx == nil {
		ctx = context.Background()
	}
	if s.shutdownTimeout > 0 {
		shutdownCtx, cancel := context.WithTimeout(ctx, s.shutdownTimeout)
		defer cancel()
		ctx = shutdownCtx
	}
	return s.app.ShutdownWithContext(ctx)
}
