package server

import (
	"context"
	"net"
	"net/http"

	"github.com/pingcap/log"
	"github.com/tidbcloud/aws-shared-provider/pkg/metaserver/config"
	"github.com/tidbcloud/aws-shared-provider/pkg/metaserver/storage"
	"go.uber.org/zap"
)

type Server struct {
	mux   *http.ServeMux
	store storage.Storage
	cfg   *config.Config
}

func New(cfg *config.Config) (*Server, error) {
	store, err := storage.NewMemDBStorage(cfg)
	if err != nil {
		return nil, err
	}
	serverMux := http.NewServeMux()
	return &Server{
		mux:   serverMux,
		store: store,
		cfg:   cfg,
	}, nil
}

func (s *Server) Start(ctx context.Context) error {
	if err := s.store.Start(ctx); err != nil {
		return err
	}
	registerHandlers(s)
	ln, err := net.Listen("tcp", s.cfg.ServerAddr)
	if err != nil {
		log.Error("[http server] failed to listen", zap.Error(err))
		return err
	}
	log.Info("[http server] ready to serve", zap.String("addr", s.cfg.ServerAddr))
	return http.Serve(ln, s.mux)
}
