package rest_test

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

	"github.com/gin-gonic/gin"
	"github.com/nexuscrm/backend/internal/interfaces/rest"
	"github.com/stretchr/testify/assert"
)

// ---------------------------------------------------------------------------
// ToolingQueryHandler.HandleQuery — validation tests
// ---------------------------------------------------------------------------

func TestToolingQueryHandler_HandleQuery_MissingQ(t *testing.T) {
	w := httptest.NewRecorder()
	c, _ := gin.CreateTestContext(w)
	c.Request = httptest.NewRequest("GET", "/tooling/query", nil)

	handler := rest.NewToolingQueryHandler(nil)
	handler.HandleQuery(c)

	assert.Equal(t, http.StatusBadRequest, w.Code)
}

func TestToolingQueryHandler_HandleQuery_EmptyQ(t *testing.T) {
	w := httptest.NewRecorder()
	c, _ := gin.CreateTestContext(w)
	c.Request = httptest.NewRequest("GET", "/tooling/query?q=", nil)

	handler := rest.NewToolingQueryHandler(nil)
	handler.HandleQuery(c)

	assert.Equal(t, http.StatusBadRequest, w.Code)
}

func TestToolingQueryHandler_HandleQuery_InvalidSOQL(t *testing.T) {
	w := httptest.NewRecorder()
	c, _ := gin.CreateTestContext(w)
	// Invalid SOQL that will fail parsing
	c.Request = httptest.NewRequest("GET", "/tooling/query?q=NOT+A+VALID+QUERY", nil)

	handler := rest.NewToolingQueryHandler(nil)
	handler.HandleQuery(c)

	assert.Equal(t, http.StatusBadRequest, w.Code)
}

// ---------------------------------------------------------------------------
// ToolingValidationHandler — unauthenticated tests
// ---------------------------------------------------------------------------

func TestToolingValidationHandler_Create_Unauthenticated(t *testing.T) {
	w := httptest.NewRecorder()
	c, _ := gin.CreateTestContext(w)
	c.Request = httptest.NewRequest("POST", "/tooling/sobjects/ValidationRule", nil)

	handler := rest.NewToolingValidationHandler(nil)
	assert.Panics(t, func() { handler.CreateValidationRule(c) })
}

func TestToolingValidationHandler_Update_Unauthenticated(t *testing.T) {
	w := httptest.NewRecorder()
	c, _ := gin.CreateTestContext(w)
	c.Request = httptest.NewRequest("PATCH", "/tooling/sobjects/ValidationRule/vr1", nil)
	c.Params = gin.Params{{Key: "id", Value: "vr1"}}

	handler := rest.NewToolingValidationHandler(nil)
	assert.Panics(t, func() { handler.UpdateValidationRule(c) })
}

func TestToolingValidationHandler_Delete_Unauthenticated(t *testing.T) {
	w := httptest.NewRecorder()
	c, _ := gin.CreateTestContext(w)
	c.Request = httptest.NewRequest("DELETE", "/tooling/sobjects/ValidationRule/vr1", nil)
	c.Params = gin.Params{{Key: "id", Value: "vr1"}}

	handler := rest.NewToolingValidationHandler(nil)
	assert.Panics(t, func() { handler.DeleteValidationRule(c) })
}

// ---------------------------------------------------------------------------
// ToolingMetadataHandler — unauthenticated tests
// ---------------------------------------------------------------------------

func TestToolingMetadataHandler_CreateCustomObject_Unauthenticated(t *testing.T) {
	w := httptest.NewRecorder()
	c, _ := gin.CreateTestContext(w)
	c.Request = httptest.NewRequest("POST", "/tooling/sobjects/CustomObject", nil)

	handler := rest.NewToolingMetadataHandler(nil)
	assert.Panics(t, func() { handler.CreateCustomObject(c) })
}

func TestToolingMetadataHandler_UpdateCustomObject_Unauthenticated(t *testing.T) {
	w := httptest.NewRecorder()
	c, _ := gin.CreateTestContext(w)
	c.Request = httptest.NewRequest("PATCH", "/tooling/sobjects/CustomObject/account", nil)
	c.Params = gin.Params{{Key: "id", Value: "account"}}

	handler := rest.NewToolingMetadataHandler(nil)
	assert.Panics(t, func() { handler.UpdateCustomObject(c) })
}

func TestToolingMetadataHandler_CreateCustomField_Unauthenticated(t *testing.T) {
	w := httptest.NewRecorder()
	c, _ := gin.CreateTestContext(w)
	c.Request = httptest.NewRequest("POST", "/tooling/sobjects/CustomField", nil)

	handler := rest.NewToolingMetadataHandler(nil)
	assert.Panics(t, func() { handler.CreateCustomField(c) })
}

func TestToolingMetadataHandler_CreateProfileLayout_Unauthenticated(t *testing.T) {
	w := httptest.NewRecorder()
	c, _ := gin.CreateTestContext(w)
	c.Request = httptest.NewRequest("POST", "/tooling/sobjects/ProfileLayout", nil)

	handler := rest.NewToolingMetadataHandler(nil)
	assert.Panics(t, func() { handler.CreateProfileLayout(c) })
}
