package plan

import (
	"net/http"
	"strconv"
	"strings"

	"github.com/tidbcloud/AgentTeam/internal/api"
	"github.com/tidbcloud/AgentTeam/internal/workflow/planmanage"
)

func requestActor(r api.WorkspaceScopedRequest) planmanage.Actor {
	return planmanage.Actor{
		Type:     planmanage.ActorTypeHuman,
		ID:       strings.TrimSpace(r.UserID()),
		MemberID: strings.TrimSpace(r.Workspace.MemberID),
	}
}

func planID(r api.WorkspaceScopedRequest) (string, error) {
	value := strings.TrimSpace(r.Gin.Param("planId"))
	if value == "" {
		return "", publicError(http.StatusBadRequest, "plan_id_required", "planId is required")
	}
	return value, nil
}

func versionID(r api.WorkspaceScopedRequest) (string, error) {
	value := strings.TrimSpace(r.Gin.Param("versionId"))
	if value == "" {
		return "", publicError(http.StatusBadRequest, "invalid_plan_version", "versionId is required")
	}
	return value, nil
}

func pageLimit(r api.WorkspaceScopedRequest) (int, error) {
	raw := strings.TrimSpace(r.Gin.Query("limit"))
	if raw == "" {
		return 0, nil
	}
	value, err := strconv.Atoi(raw)
	if err != nil || value < 1 || value > 100 {
		return 0, publicError(http.StatusBadRequest, "invalid_limit", "limit must be between 1 and 100")
	}
	return value, nil
}

func includeArchived(r api.WorkspaceScopedRequest) bool {
	switch strings.ToLower(strings.TrimSpace(r.Gin.Query("includeArchived"))) {
	case "1", "true", "yes":
		return true
	default:
		return false
	}
}

func idempotencyKey(r api.WorkspaceScopedRequest) string {
	return strings.TrimSpace(r.Gin.GetHeader(idempotencyHeader))
}
