package trigger

import (
	"net/http"
	"net/http/httptest"
	"strings"
	"testing"

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

	"github.com/tidbcloud/AgentTeam/internal/api"
	"github.com/tidbcloud/AgentTeam/internal/api/dto"
)

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

	recorder := httptest.NewRecorder()
	ctx, _ := gin.CreateTestContext(recorder)
	ctx.Request = httptest.NewRequest(http.MethodPost, "/api/v1/workspaces/wsp_1/triggers:validate", strings.NewReader("{"))
	ctx.Request.Header.Set("Content-Type", "application/json")
	setTriggerHandlerAuth(ctx)

	handleTriggerWorkspaceJSON[dto.TriggerValidateRequest](newRouteHandlers(Dependencies{TriggerService: &fakeTriggerService{}}).validation.Validate)(ctx)

	require.Equal(t, http.StatusBadRequest, recorder.Code)
	require.Equal(t, "invalid request body", jsonError(t, recorder))
}

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

	recorder := httptest.NewRecorder()
	ctx, _ := gin.CreateTestContext(recorder)
	ctx.Request = httptest.NewRequest(http.MethodPatch, "/api/v1/workspaces/wsp_1/triggers/trg_1", strings.NewReader("{"))
	ctx.Request.Header.Set("Content-Type", "application/json")
	ctx.Params = gin.Params{{Key: "triggerId", Value: "trg_1"}}
	setTriggerHandlerAuth(ctx)

	handleTriggerWorkspaceJSON[dto.TriggerMutationRequest](newRouteHandlers(Dependencies{TriggerService: &fakeTriggerService{}}).detail.Update)(ctx)

	require.Equal(t, http.StatusBadRequest, recorder.Code)
	require.Equal(t, "invalid request body", jsonError(t, recorder))
}

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

	recorder := httptest.NewRecorder()
	ctx, _ := gin.CreateTestContext(recorder)
	ctx.Request = httptest.NewRequest(http.MethodPost, "/api/v1/workspaces/wsp_1/triggers/trg_1:pause", nil)
	ctx.Params = gin.Params{{Key: "triggerAction", Value: "trg_1:pause"}}
	setTriggerHandlerAuth(ctx)

	api.HandleWorkspaceScoped(newRouteHandlers(Dependencies{}).lifecycle.Action)(ctx)

	require.Equal(t, http.StatusNotImplemented, recorder.Code)
	require.Equal(t, "Trigger service is not configured", jsonError(t, recorder))
}
