package handler

import (
	"net/http"

	"github.com/creasty/defaults"
	"github.com/labstack/echo/v4"

	"github.com/pingcap/test-infra/common/model"
	reqM "github.com/pingcap/test-infra/common/model/tcms/request"
	serror "github.com/pingcap/test-infra/services/tcms/service/common/errors"
	"github.com/pingcap/test-infra/services/tcms/utils"
)

// ListGitHubPlanBranchs ...
// @Summary Returns all active branchs in GitHub repo.
// @ID list-ghplan-branchs
// @Tags plan
// @Param prefix query string false "Filter by branch prefix"
// @Success 200 {array} string
// @Failure default {object} HTTPError
// @Router /plans/branchs [get]
func (h *HTTPHandler) ListGitHubPlanBranchs(c echo.Context) error {
	ctx := c.(utils.Context)

	branchs, err := h.service.GitHubPlan.ListBranchNames(ctx, ctx.QueryParam("prefix"))
	if err != nil {
		ctx.Log().Errorf(err, "list branchs failed")
		return err
	}

	return ctx.JSON(http.StatusOK, branchs)
}

func (h *HTTPHandler) CreateGitHubPlan(c echo.Context) error {
	ctx := c.(utils.Context)

	ghplan, err := bindGHPlanCreateRequest(ctx)
	if err != nil {
		ctx.Log().Warnf("failed to parse request, err= %v", err)
		return err
	}

	pid, err := h.service.GitHubPlan.Upsert(ctx, ghplan)
	if err != nil {
		return err
	}

	return ctx.JSON(http.StatusOK, echo.Map{"id": pid})
}

func (h *HTTPHandler) DeleteOldGitHubPlans(c echo.Context) error {
	ctx := c.(utils.Context)

	branch := ctx.QueryParam("branch")
	if branch == "" {
		return serror.NewMsg(http.StatusBadRequest, "branch is required")
	}

	if err := h.service.GitHubPlan.DeleteOlds(ctx, branch); err != nil {
		return err
	}

	return ctx.JSON(http.StatusOK, echo.Map{"result": "ok"})
}

func bindGHPlanCreateRequest(ctx utils.Context) (*reqM.PlanCreateRequest, error) {
	req := &reqM.PlanCreateRequest{}
	if err := ctx.Bind(req); err != nil {
		return nil, serror.New(http.StatusBadRequest, err)
	}
	defaults.MustSet(req)
	if err := req.Validate(); err != nil {
		return nil, serror.New(http.StatusBadRequest, err)
	}
	if req.Type != model.TestPlanKindGithub {
		return nil, serror.NewMsg(http.StatusBadRequest, "only GitHub plan is accepted")
	}
	return req, nil
}
