package query

import (
	"github.com/gin-gonic/gin"

	querysvc "github.com/tidbcloud/aisupport/services/jsm-syncer/internal/services/query"
)

// GetForgeUserOrgs returns the organizations visible to the user identified by
// the user_email query parameter. Kong still authenticates the Forge request,
// but FIT identity claims are not used for TiDB Cloud user resolution.
func (h *Handler) GetForgeUserOrgs(c *gin.Context) {
	result, err := h.query.GetUserOrgs(c, c.Query("user_email"))
	if err != nil {
		fail(c, err)
		return
	}

	success(c, &GetUserOrgsResponse{
		User: toUserResponse(result.User),
		Orgs: toOrgResponses(result.Orgs),
	})
}

// GetForgeUserLakes returns the lakes visible to the user identified by the
// user_email query parameter.
func (h *Handler) GetForgeUserLakes(c *gin.Context) {
	result, err := h.query.GetUserLakes(c, c.Query("user_email"))
	if err != nil {
		fail(c, err)
		return
	}

	success(c, &GetUserLakesResponse{
		User:  toUserResponse(result.User),
		Lakes: toLakeResponses(result.Lakes),
	})
}

// GetForgeOrgLakes returns all lakes in an organization only after the query
// service verifies that user_email belongs to an active organization member.
func (h *Handler) GetForgeOrgLakes(c *gin.Context) {
	orgID := c.Param("tidbcloud_org_id")
	lakes, err := h.query.GetLakesByOrgIDForUser(c, c.Query("user_email"), orgID)
	if err != nil {
		fail(c, err)
		return
	}

	success(c, &GetLakesByOrgIDResponse{
		TiDBCloudOrgID: orgID,
		Lakes:          toLakeResponses(lakes),
	})
}

// GetForgeOrgClusters returns clusters only after the query service verifies
// that the user identified by user_email is an active member of the org.
func (h *Handler) GetForgeOrgClusters(c *gin.Context) {
	pageSize, err := parseClusterPageSize(c)
	if err != nil {
		fail(c, err)
		return
	}

	orgID := c.Param("tidbcloud_org_id")
	page, err := h.query.ListOrgClustersForUser(c, c.Query("user_email"), orgID, querysvc.ListClustersOptions{
		PageSize:  pageSize,
		PageToken: c.Query("page_token"),
		ClusterID: c.Query("cluster_id"),
	})
	if err != nil {
		fail(c, err)
		return
	}

	success(c, &GetOrgClustersResponse{
		TiDBCloudOrgID: orgID,
		Clusters:       toClusterResponses(page.Clusters),
		NextPageToken:  page.NextPageToken,
	})
}
