package repositoryroutecontract

import (
	"net/http"
	"strings"
)

// ClassifyAGSRequest is the dependency-light Desktop/runtime candidate
// classifier. It cannot activate a split route; the split seams consume exact
// metadata from the real AGS registration tree instead.
func ClassifyAGSRequest(request *http.Request) Scope {
	if request == nil || request.URL == nil {
		return Scope{RegisteredScope: ScopeUnsupported}
	}
	if isPublicWorkspaceRoute(request.Method, request.URL.Path) {
		return Scope{RegisteredScope: ScopePublicWorkspaceDiscovery}
	}
	if repository, capability, ok := GitSmartHTTPAuthorizationTarget(request); ok {
		return Scope{RegisteredScope: ScopeGitCredentialOnly, Repository: repository, Capability: capability}
	}
	if repository, capability, ok := RepositoryAuthorizationTarget(request); ok {
		kind := ScopeRepositoryCredentialOrSession
		return Scope{RegisteredScope: kind, Repository: repository, Capability: capability}
	}
	if repository, capability, ok := RepositoryIDAuthorizationTarget(request); ok {
		return Scope{RegisteredScope: ScopeRepositoryCredentialOrSession, Repository: repository, Capability: capability}
	}
	if isSessionWorkspaceRoute(request.Method, request.URL.Path) {
		return Scope{RegisteredScope: ScopeSessionWorkspace}
	}
	return Scope{RegisteredScope: ScopeUnsupported}
}

func isPublicWorkspaceRoute(method, path string) bool {
	if method != http.MethodGet {
		return false
	}
	parts := strings.Split(strings.TrimPrefix(path, "/"), "/")
	return len(parts) == 2 && parts[0] == "avatars" && safePathAtom(parts[1])
}

func isSessionWorkspaceRoute(method, path string) bool {
	if method != http.MethodGet {
		return false
	}
	switch path {
	case "/api/v3/user", "/api/v3/user/repos", "/api/v3/search/code", "/api/v3/search/labels", "/api/ext/v1/user/tokens":
		return true
	default:
		return false
	}
}
