package http

import (
	"context"
	"log"
	"net"
	"net/http"
	"os"
	"time"
)

type HttpServer struct {
	s http.Server
}

func NewHttpServer(r http.Handler) *HttpServer {
	return &HttpServer{s: http.Server{
		ReadTimeout:  3 * time.Second,
		WriteTimeout: 3 * time.Second,
		Handler:      r}}
}

func (s *HttpServer) Start(network, address string) error {
	listener, err := net.Listen(network, address)
	if err != nil {
		return err
	}

	if listener.Addr().Network() == "unix" {
		os.Chmod(address, 0777)
	}

	go func() {
		if err = s.s.Serve(listener); err != nil && err != http.ErrServerClosed {
			log.Fatalln(err)
		}
	}()

	return nil
}

func (s *HttpServer) Stop() error {
	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
	defer cancel()

	if err := s.s.Shutdown(ctx); err != nil {
		return err
	}

	return nil
}
