package tidbtools

import (
	"strconv"

	"github.com/gin-gonic/gin"
	"github.com/tidbcloud/devops/api"
	toolsdto "github.com/tidbcloud/devops/api/tidbtools"
	ctrl "github.com/tidbcloud/devops/pkg/controller"
)

// ListImports
//
//	@Id				TidbToolsControllerListImports
//	@Description	list Dedicated TiDB imports of a cluster (upstream RPC pending)
//	@Tags			TidbToolsController
//	@Accept			json
//	@Produce		json
//	@Param			cluster_id	path		string	true	"cluster id"
//	@Param			page		query		int		false	"page, default 1"
//	@Param			page_size	query		int		false	"page size, default 20, max 200"
//	@Success		200			{object}	tidbtools.ListImportsResp
//	@Failure		default		{object}	api.BaseResp
//	@Router			/api/v1/devops/{cluster_id}/tidbtools/imports [get]
func (c *TidbToolsController) ListImports(ctx *gin.Context) {
	clusterID, ci, ok := c.requireClusterAccess(ctx)
	if !ok {
		return
	}
	if ci.clusterType != dedicatedType {
		c.notImplemented(ctx, "ListImports (non-Dedicated)")
		return
	}
	page, pageSize, err := parsePaging(ctx)
	if err != nil {
		ctrl.FailWithCode(ctx, err, api.ErrCodeInvalidArgument)
		return
	}
	resp, err := c.svc.ListImports(ctx, ci.orgID, ci.projectID, clusterID, page, pageSize)
	if err != nil {
		ctrl.Fail(ctx, err)
		return
	}
	ctrl.Success(ctx, toolsdto.ToListImportsResp(resp))
}

// ListImportIntoTasks
//
//	@Id				TidbToolsControllerListImportIntoTasks
//	@Description	list Premium IMPORT INTO tasks of a cluster (upstream RPC pending)
//	@Tags			TidbToolsController
//	@Accept			json
//	@Produce		json
//	@Param			cluster_id	path		string	true	"cluster id"
//	@Param			page		query		int		false	"page, default 1"
//	@Param			page_size	query		int		false	"page size, default 20, max 200"
//	@Success		200			{object}	tidbtools.ListImportIntoTasksResp
//	@Failure		default		{object}	api.BaseResp
//	@Router			/api/v1/devops/{cluster_id}/tidbtools/import-into-tasks [get]
func (c *TidbToolsController) ListImportIntoTasks(ctx *gin.Context) {
	clusterID, ci, ok := c.requireClusterAccess(ctx)
	if !ok {
		return
	}
	if ci.clusterType == dedicatedType {
		// IMPORT INTO is a Premium-only feature; Dedicated clusters use
		// the standard Import service (ListImports), not IMPORT INTO tasks.
		c.notImplemented(ctx, "ListImportIntoTasks (not applicable for Dedicated clusters)")
		return
	}
	// The upstream IMPORT INTO RPC is page-token based, not page/page_size.
	// We still parse the query for validation and forward only page_size.
	_, pageSize, err := parsePaging(ctx)
	if err != nil {
		ctrl.FailWithCode(ctx, err, api.ErrCodeInvalidArgument)
		return
	}
	resp, err := c.svc.ListImportIntoTasks(ctx, strconv.FormatUint(clusterID, 10), pageSize)
	if err != nil {
		ctrl.Fail(ctx, err)
		return
	}
	ctrl.Success(ctx, toolsdto.ToListImportIntoTasksResp(resp))
}

// GetImportIntoTask
//
//	@Id				TidbToolsControllerGetImportIntoTask
//	@Description	get a Premium IMPORT INTO task by id (upstream RPC pending)
//	@Tags			TidbToolsController
//	@Accept			json
//	@Produce		json
//	@Param			cluster_id	path		string	true	"cluster id"
//	@Param			task_id		path		string	true	"task id"
//	@Success		200			{object}	tidbtools.GetImportIntoTaskResp
//	@Failure		default		{object}	api.BaseResp
//	@Router			/api/v1/devops/{cluster_id}/tidbtools/import-into-tasks/{task_id} [get]
func (c *TidbToolsController) GetImportIntoTask(ctx *gin.Context) {
	clusterID, ci, ok := c.requireClusterAccess(ctx)
	if !ok {
		return
	}
	if ci.clusterType == dedicatedType {
		c.notImplemented(ctx, "GetImportIntoTask (not applicable for Dedicated clusters)")
		return
	}
	taskID := ctx.Param("task_id")
	task, err := c.svc.GetImportIntoTask(ctx, strconv.FormatUint(clusterID, 10), taskID)
	if err != nil {
		ctrl.Fail(ctx, err)
		return
	}
	ctrl.Success(ctx, toolsdto.ToGetImportIntoTaskResp(task))
}
