package org

import (
	"testing"

	"github.com/gin-gonic/gin"
	"github.com/stretchr/testify/require"
)

func TestRegisterRoutesOwnsOrganizationRoutes(t *testing.T) {
	t.Parallel()

	router := gin.New()
	RegisterRoutes(router, Dependencies{Organizations: routeOrganizationProvider{}})

	counts := orgRouteCounts(router)
	for _, route := range orgRouteKeys() {
		require.Equal(t, 1, counts[route], route)
	}
	require.Zero(t, counts["POST /api/v1/orgs"])
}

func orgRouteKeys() []string {
	return []string{
		"GET /api/v1/orgs",
		"PATCH /api/v1/orgs/:orgId",
		"GET /api/v1/orgs/:orgId/settings",
		"GET /api/v1/orgs/:orgId/hosted-models",
		"GET /api/v1/orgs/:orgId/hosted-model-settings",
		"PATCH /api/v1/orgs/:orgId/hosted-model-settings",
		"GET /api/v1/orgs/:orgId/knowledge-qa-policy",
		"PUT /api/v1/orgs/:orgId/knowledge-qa-policy",
		"GET /api/v1/orgs/:orgId/knowledge-qa-policy/metrics",
		"GET /api/v1/orgs/:orgId/directory-sync-runs/:syncRunId",
		"PATCH /api/v1/orgs/:orgId/settings",
		"GET /api/v1/orgs/:orgId/enterprise/feishu",
		"PUT /api/v1/orgs/:orgId/enterprise/feishu/credentials",
		"DELETE /api/v1/orgs/:orgId/enterprise/feishu/credentials",
		"POST /api/v1/orgs/:orgId/feishu/sync",
		"GET /api/v1/orgs/:orgId/invites",
		"POST /api/v1/orgs/:orgId/invites",
		"DELETE /api/v1/orgs/:orgId/invites/:inviteId",
		"GET /api/v1/orgs/:orgId/units",
		"POST /api/v1/orgs/:orgId/units",
		"GET /api/v1/orgs/:orgId/units/:unitId/members",
		"POST /api/v1/orgs/:orgId/units/:unitId/members",
		"DELETE /api/v1/orgs/:orgId/units/:unitId/members/:memberId",
		"GET /api/v1/orgs/:orgId/teams",
		"POST /api/v1/orgs/:orgId/teams",
		"GET /api/v1/orgs/:orgId/teams/:teamId/members",
		"POST /api/v1/orgs/:orgId/teams/:teamId/members",
		"DELETE /api/v1/orgs/:orgId/teams/:teamId/members/:memberId",
		"GET /api/v1/orgs/:orgId/members",
		"POST /api/v1/orgs/:orgId/members",
		"GET /api/v1/orgs/:orgId/members/:memberId/removal-impact",
		"DELETE /api/v1/orgs/:orgId/members/:memberId",
		"GET /api/v1/orgs/:orgId/members/:memberId/units",
		"PATCH /api/v1/orgs/:orgId/members/:memberId/primary-team",
		"PATCH /api/v1/orgs/:orgId/members/:memberId/role",
		"GET /api/v1/orgs/:orgId/workspaces",
		"POST /api/v1/orgs/:orgId/workspaces",
		"GET /api/v1/orgs/:orgId/providers",
		"GET /api/v1/orgs/:orgId/llm-proxy-keys",
		"POST /api/v1/orgs/:orgId/llm-proxy-keys",
		"DELETE /api/v1/orgs/:orgId/llm-proxy-keys/:keyId",
		"GET /api/v1/orgs/:orgId/provider-routes",
		"POST /api/v1/orgs/:orgId/provider-routes",
		"PATCH /api/v1/orgs/:orgId/provider-routes/:routeId",
		"DELETE /api/v1/orgs/:orgId/provider-routes/:routeId",
		"GET /api/v1/orgs/:orgId/provider-routes/:routeId/groups",
		"POST /api/v1/orgs/:orgId/provider-routes/:routeId/groups",
		"PATCH /api/v1/orgs/:orgId/provider-routes/:routeId/groups/:groupId",
		"DELETE /api/v1/orgs/:orgId/provider-routes/:routeId/groups/:groupId",
		"POST /api/v1/orgs/:orgId/providers",
		"GET /api/v1/orgs/:orgId/providers/:providerId",
		"PATCH /api/v1/orgs/:orgId/providers/:providerId",
		"DELETE /api/v1/orgs/:orgId/providers/:providerId",
		"GET /api/v1/orgs/:orgId/providers/:providerId/tokens",
		"POST /api/v1/orgs/:orgId/providers/:providerId/tokens",
		"DELETE /api/v1/orgs/:orgId/providers/:providerId/tokens/:tokenId",
		"GET /api/v1/orgs/:orgId/workspaces/:workspaceId/members",
		"GET /api/v1/orgs/:orgId/workspaces/:workspaceId/providers",
		"POST /api/v1/orgs/:orgId/workspaces/:workspaceId/providers/:providerId",
		"DELETE /api/v1/orgs/:orgId/workspaces/:workspaceId/providers/:providerId",
		"GET /api/v1/orgs/:orgId/workspaces/:workspaceId/provider-routes",
		"POST /api/v1/orgs/:orgId/workspaces/:workspaceId/provider-routes/:routeId",
		"DELETE /api/v1/orgs/:orgId/workspaces/:workspaceId/provider-routes/:routeId",
		"GET /api/v1/orgs/:orgId/workspaces/:workspaceId/hosted-model-authorization",
		"POST /api/v1/orgs/:orgId/workspaces/:workspaceId/hosted-model-authorization/preview",
		"PUT /api/v1/orgs/:orgId/workspaces/:workspaceId/hosted-model-authorization",
		"GET /api/v1/orgs/:orgId/workspaces/:workspaceId/teams",
		"POST /api/v1/orgs/:orgId/workspaces/:workspaceId/teams/:teamId",
		"DELETE /api/v1/orgs/:orgId/workspaces/:workspaceId/teams/:teamId",
		"POST /api/v1/orgs/:orgId/workspaces/:workspaceId/members/:memberId",
		"DELETE /api/v1/orgs/:orgId/workspaces/:workspaceId/members/:memberId",
	}
}

func orgRouteCounts(router *gin.Engine) map[string]int {
	counts := make(map[string]int)
	for _, route := range router.Routes() {
		counts[route.Method+" "+route.Path]++
	}
	return counts
}

type routeOrganizationProvider struct {
	OrganizationProvider
}
