package http

import (
	"log/slog"
	stdhttp "net/http"

	"github.com/go-chi/chi/v5"
	chimiddleware "github.com/go-chi/chi/v5/middleware"
)

type AuthConfig struct {
	Username string
	Password string
}

func NewRouter(handler *Handler, logger *slog.Logger, auth AuthConfig, protoSocket stdhttp.Handler, protoSocketPath string) stdhttp.Handler {
	r := chi.NewRouter()
	r.Use(chimiddleware.RequestID)
	r.Use(chimiddleware.RealIP)
	r.Use(loggingMiddleware(logger))
	r.Use(chimiddleware.Recoverer)

	r.Get("/healthz", handler.Healthz)
	r.Post("/api/integrations/plane/webhook", handler.ReceivePlaneWebhook)
	r.Post("/api/integrations/gito/webhook", handler.ReceiveGitoWebhook)

	protected := chi.NewRouter()
	protected.Use(basicAuthMiddleware(auth))
	protected.Get("/readyz", handler.Readyz)

	if protoSocket != nil && protoSocketPath != "" {
		protected.Handle(protoSocketPath, protoSocket)
	}

	protected.Route("/api", func(r chi.Router) {
		r.Post("/integrations/plane/tasks", handler.CreatePlaneTask)
		r.Post("/integrations/{provider}/tasks", handler.CreateWorkItemTask)
		r.Post("/tasks", handler.CreateTask)
		r.Get("/tasks", handler.ListTasks)
		r.Get("/tasks/{id}", handler.GetTask)
		r.Post("/tasks/{id}/enqueue", handler.EnqueueTask)
	})
	r.Mount("/", protected)

	return r
}
