package modules

import (
	"encoding/json"
	"errors"
	"net/http"
	"net/http/httptest"
	"testing"

	"github.com/gin-gonic/gin"
	redisclient "github.com/redis/go-redis/v9"
	"github.com/stretchr/testify/require"

	"security-center-backend/internal/modules/caasm/mocks"
	caasmqueue "security-center-backend/internal/modules/caasm/queue"
)

func TestBuildCAASMExposesQueueInitializationFailureInRuntimeStatus(t *testing.T) {
	originalNewJobQueue := newCAASMJobQueue
	t.Cleanup(func() { newCAASMJobQueue = originalNewJobQueue })
	newCAASMJobQueue = func(*redisclient.Client, string, string) (*caasmqueue.JobQueue, error) {
		return nil, errors.New("redis unavailable")
	}

	module := BuildCAASM(CAASMBuildInput{
		Redis:     redisclient.NewClient(&redisclient.Options{Addr: "127.0.0.1:1"}),
		AssetRepo: &mocks.MockAssetRepository{},
	})
	require.NotNil(t, module.Handler)

	gin.SetMode(gin.TestMode)
	router := gin.New()
	module.Handler.RegisterRoutes(router.Group(""))
	req := httptest.NewRequest(http.MethodGet, "/caasm/runtime/status", nil)
	rr := httptest.NewRecorder()

	router.ServeHTTP(rr, req)

	require.Equal(t, http.StatusOK, rr.Code)
	var body struct {
		Code int `json:"code"`
		Data struct {
			RuntimeConfigured bool   `json:"runtime_configured"`
			QueueAvailable    bool   `json:"queue_available"`
			QueueDegraded     bool   `json:"queue_degraded"`
			QueueError        string `json:"queue_error"`
		} `json:"data"`
	}
	require.NoError(t, json.Unmarshal(rr.Body.Bytes(), &body))
	require.Equal(t, 0, body.Code)
	require.True(t, body.Data.RuntimeConfigured)
	require.False(t, body.Data.QueueAvailable)
	require.True(t, body.Data.QueueDegraded)
	require.Contains(t, body.Data.QueueError, "redis unavailable")
}
