package gateway

import (
	"net/http"
	"strings"

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

func workspaceV1IMRoute(path string) (string, bool) {
	parts := strings.Split(strings.Trim(path, "/"), "/")
	if len(parts) < 5 || parts[0] != "api" || parts[1] != "v1" || parts[2] != "workspaces" {
		return "", false
	}
	workspaceID := strings.TrimSpace(parts[3])
	if !api.IsValidRouteWorkspaceID(workspaceID) {
		return "", false
	}
	switch parts[4] {
	case "internal":
		return workspaceID, len(parts) >= 6 && parts[5] == "repository-access-tokens"
	case "agent-thread":
		return workspaceID, len(parts) == 6 && parts[5] == "session-channel"
	case "repository-owners":
		return workspaceID, len(parts) == 5
	case "repository-names":
		return workspaceID, len(parts) == 6 && parts[5] == "available"
	case "roles:from-agent":
		return workspaceID, len(parts) == 5
	case "snapshot", "scopes", "dm-channels", "messages", "conversations", "events", "daemon", "agents", "agents:from-role", "agent-collaborators", "mention-candidates", "machines", "miniapp-pairing-codes", "tasks", "task-board", "channels", "channel-share-cards", "threads", "thread-share-cards", "providers", "selectable-models", "sidebar", "apps", "app-installations", "app-installation-requests", "custom-apps", "custom-app-requests", "runner-credentials", "app-webhook-deliveries", "app-runtime", "service-event-subscriptions", "service-account-create-requests", "service-accounts", "avatar-assets", "provider-watches", "schedules", "schedules:validate", "triggers", "triggers:validate", "workflow", "attachments", "stickers", "team-templates", "teams", "review", "review-contexts", "reviews", "projects", "knowledge-qa", "onboarding",
		"kb", "kb-publication-reviews", "memory", "skills", "roles", "repository-access-tokens", "personal-access-tokens", "automations", "mcp", "repositories", "llm", "collaborator-requests":
		return workspaceID, true
	default:
		return "", false
	}
}

func rewriteRequestPathPrefix(request *http.Request, oldPrefix, newPrefix string) bool {
	if request == nil || request.URL == nil || !pathMatchesPrefix(request.URL.Path, oldPrefix) {
		return false
	}
	request.URL.Path = newPrefix + strings.TrimPrefix(request.URL.Path, oldPrefix)
	if request.URL.RawPath == "" {
		return true
	}
	if !pathMatchesPrefix(request.URL.RawPath, oldPrefix) {
		return false
	}
	request.URL.RawPath = newPrefix + strings.TrimPrefix(request.URL.RawPath, oldPrefix)
	return true
}

func workspaceQualifiedRawSegmentIsValid(request *http.Request) bool {
	if request == nil || request.URL == nil {
		return true
	}
	const prefix = "/api/v1/workspaces/"
	escapedPath := request.URL.EscapedPath()
	if !strings.HasPrefix(escapedPath, prefix) {
		return true
	}
	segment := strings.SplitN(strings.TrimPrefix(escapedPath, prefix), "/", 2)[0]
	return api.IsValidRouteWorkspaceID(segment)
}
