package schedule

import (
	"strconv"

	"github.com/tidbcloud/AgentTeam/internal/api"
	"github.com/tidbcloud/AgentTeam/internal/api/dto"
	"github.com/tidbcloud/AgentTeam/internal/api/dto/converter"
	"github.com/tidbcloud/AgentTeam/internal/schedule/manage"
)

// List handles GET /api/v1/workspaces/:workspaceId/schedules.
func (handler *CollectionHandler) List(request api.WorkspaceScopedRequest) (api.Response, error) {
	listRequest, err := listRequestFromRequest(request.Gin)
	if err != nil {
		return api.Response{}, err
	}
	result, err := handler.scheduleService.ListSchedulesForOwnerWithFilter(request.Context(), request.UserID(), request.WorkspaceID(), listRequest.filter)
	if err != nil {
		return api.Response{}, err
	}
	if listRequest.page {
		return api.OK(schedulePageResponse(result, listRequest)), nil
	}
	if len(result) > listRequest.limit {
		result = result[:listRequest.limit]
	}
	return api.OK(dto.ScheduleListResponse(result)), nil
}

func schedulePageResponse(
	result []manage.ScheduleView,
	request scheduleListRequest,
) dto.SchedulePageResponse {
	hasMore := len(result) > request.limit
	if hasMore {
		result = result[:request.limit]
	}
	nextCursor := ""
	if hasMore {
		nextCursor = strconv.Itoa(request.filter.Offset + request.limit)
	}
	return dto.SchedulePageResponse{
		Schedules:  result,
		Limit:      request.limit,
		Cursor:     request.cursor,
		HasMore:    hasMore,
		NextCursor: nextCursor,
	}
}

// Create handles POST /api/v1/workspaces/:workspaceId/schedules.
func (handler *CollectionHandler) Create(r api.WorkspaceScopedJSON[dto.ScheduleMutationRequest]) (api.Response, error) {
	result, err := handler.scheduleService.CreateScheduleForOwner(r.Context(), r.UserID(), r.WorkspaceID(), converter.FromScheduleMutationRequest(r.Body))
	if err != nil {
		return api.Response{}, err
	}
	return api.OK(result), nil
}
