// Package schedule contains browser-facing schedule management routes.
package schedule

import (
	"github.com/gin-gonic/gin"

	"github.com/tidbcloud/AgentTeam/internal/api"
	"github.com/tidbcloud/AgentTeam/internal/api/dto"
)

const invalidRequestBodyMessage = "invalid request body"

func handleWorkspaceJSON[T any](handler func(api.WorkspaceScopedJSON[T]) (api.Response, error)) gin.HandlerFunc {
	return api.HandleWorkspaceScopedJSON[T](handler, api.WithInvalidJSONMessage(invalidRequestBodyMessage))
}

// Dependencies contains collaborators and config for schedule routes.
type Dependencies struct {
	AuthStore                 api.SessionAuthenticator
	WorkspaceStore            api.WorkspaceResolver
	EmailVerificationRequired bool
	ScheduleService           Service
}

// RegisterRoutes mounts browser-facing schedule management routes.
func RegisterRoutes(router gin.IRouter, dependencies Dependencies) {
	if router == nil {
		return
	}
	apiGroup := router.Group("/api")
	workspaceScoped := apiGroup.Group(
		"/v1/workspaces/:workspaceId",
		api.RequireAuthenticatedUser(dependencies.AuthStore),
		api.RequireVerifiedIdentity(dependencies.EmailVerificationRequired),
		api.RequireRouteWorkspace(dependencies.WorkspaceStore),
	)
	handlers := newRouteHandlers(dependencies)
	workspaceScoped.GET("/schedules", api.HandleWorkspaceScoped(handlers.collection.List))
	workspaceScoped.POST("/schedules", handleWorkspaceJSON[dto.ScheduleMutationRequest](handlers.collection.Create))
	workspaceScoped.POST("/schedules:validate", handleWorkspaceJSON[dto.ScheduleValidateRequest](handlers.validation.Validate))
	workspaceScoped.GET("/schedules/:scheduleId", api.HandleWorkspaceScoped(handlers.detail.Get))
	workspaceScoped.PATCH("/schedules/:scheduleId", handleWorkspaceJSON[dto.ScheduleMutationRequest](handlers.detail.Update))
	workspaceScoped.DELETE("/schedules/:scheduleId", api.HandleWorkspaceScoped(handlers.detail.Delete))
	workspaceScoped.POST("/schedules/:scheduleAction", api.HandleWorkspaceScoped(handlers.lifecycle.Action))
	workspaceScoped.GET("/schedules/:scheduleId/runs", api.HandleWorkspaceScoped(handlers.runs.List))
}
