package handler

import (
	"fmt"
	"os"

	"github.com/labstack/echo-contrib/pprof"
	echo "github.com/labstack/echo/v4"
	"github.com/tidbcloud/pov-service/internal/config"
	"github.com/tidbcloud/pov-service/internal/pkg/log"
	"go.uber.org/dig"
)

type Result struct {
	dig.Out

	Handler Handler `group:"handler"`
}

type Handler interface {
	Register(e *echo.Echo) error
}

type ManagerParams struct {
	dig.In

	*echo.Echo
	*config.Config
	Handlers []Handler `group:"handler"`
}

type Manager struct {
	*echo.Echo
	Config   config.Config
	Handlers []Handler
}

func NewManager(param ManagerParams) *Manager {
	return &Manager{
		Echo:     param.Echo,
		Handlers: param.Handlers,
		Config:   *param.Config,
	}
}

func (m *Manager) Register() error {
	for _, h := range m.Handlers {
		if err := h.Register(m.Echo); err != nil {
			return err
		}
	}

	return nil
}

func (m *Manager) Start() {
	go func() {
		if os.Getenv("PPROF") == "1" {
			pprof.Register(m.Echo)
		}
		err := m.Echo.Start(fmt.Sprintf(":%d", m.Config.Port))
		log.Log.Infof("shutting down the server, err=%v", err)
	}()

}

func (m *Manager) Shutdown() {
}
