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"
)

// ---------------------------------------------------------------------------
// UIAPIHandler.HandleRecordUI — input validation
// ---------------------------------------------------------------------------

func TestUIAPIHandler_HandleRecordUI_MissingRecordIds(t *testing.T) {
	w := httptest.NewRecorder()
	c, _ := gin.CreateTestContext(w)
	c.Request = httptest.NewRequest("GET", "/ui-api/record-ui/", nil)
	c.Params = gin.Params{{Key: "recordIds", Value: ""}}

	handler := rest.NewUIAPIHandler(nil, nil, nil)
	handler.HandleRecordUI(c)

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

func TestUIAPIHandler_HandleRecordUI_TooManyIds(t *testing.T) {
	// Build a string with 51 IDs
	ids := ""
	for i := 0; i < 51; i++ {
		if i > 0 {
			ids += ","
		}
		ids += "001xxx"
	}

	w := httptest.NewRecorder()
	c, _ := gin.CreateTestContext(w)
	c.Request = httptest.NewRequest("GET", "/ui-api/record-ui/"+ids, nil)
	c.Params = gin.Params{{Key: "recordIds", Value: ids}}

	handler := rest.NewUIAPIHandler(nil, nil, nil)
	handler.HandleRecordUI(c)

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

// ---------------------------------------------------------------------------
// UIAPIHandler.HandleObjectInfo — input validation
// ---------------------------------------------------------------------------

func TestUIAPIHandler_HandleObjectInfo_MissingObjectName(t *testing.T) {
	w := httptest.NewRecorder()
	c, _ := gin.CreateTestContext(w)
	c.Request = httptest.NewRequest("GET", "/ui-api/object-info/", nil)
	c.Params = gin.Params{{Key: "objectApiName", Value: ""}}

	handler := rest.NewUIAPIHandler(nil, nil, nil)
	handler.HandleObjectInfo(c)

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

// ---------------------------------------------------------------------------
// UIAPIHandler.HandleLayout — input validation
// ---------------------------------------------------------------------------

func TestUIAPIHandler_HandleLayout_MissingObjectName(t *testing.T) {
	w := httptest.NewRecorder()
	c, _ := gin.CreateTestContext(w)
	c.Request = httptest.NewRequest("GET", "/ui-api/layout/", nil)
	c.Params = gin.Params{{Key: "objectApiName", Value: ""}}

	handler := rest.NewUIAPIHandler(nil, nil, nil)
	handler.HandleLayout(c)

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

// ---------------------------------------------------------------------------
// UIAPIHandler.HandleRecordDefaultsCreate — input validation
// ---------------------------------------------------------------------------

func TestUIAPIHandler_HandleRecordDefaultsCreate_MissingObjectName(t *testing.T) {
	w := httptest.NewRecorder()
	c, _ := gin.CreateTestContext(w)
	c.Request = httptest.NewRequest("GET", "/ui-api/record-defaults/create/", nil)
	c.Params = gin.Params{{Key: "objectApiName", Value: ""}}

	handler := rest.NewUIAPIHandler(nil, nil, nil)
	handler.HandleRecordDefaultsCreate(c)

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

// ---------------------------------------------------------------------------
// UIAPIHandler.HandleRecordDefaultsClone — input validation
// ---------------------------------------------------------------------------

func TestUIAPIHandler_HandleRecordDefaultsClone_MissingRecordId(t *testing.T) {
	w := httptest.NewRecorder()
	c, _ := gin.CreateTestContext(w)
	c.Request = httptest.NewRequest("GET", "/ui-api/record-defaults/clone/", nil)
	c.Params = gin.Params{{Key: "recordId", Value: ""}}

	handler := rest.NewUIAPIHandler(nil, nil, nil)
	handler.HandleRecordDefaultsClone(c)

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

// ---------------------------------------------------------------------------
// UIAPIHandler.HandleListInfo — input validation
// ---------------------------------------------------------------------------

func TestUIAPIHandler_HandleListInfo_MissingObjectName(t *testing.T) {
	w := httptest.NewRecorder()
	c, _ := gin.CreateTestContext(w)
	c.Request = httptest.NewRequest("GET", "/ui-api/list-info//AllAccounts", nil)
	c.Params = gin.Params{
		{Key: "objectApiName", Value: ""},
		{Key: "listViewApiName", Value: "AllAccounts"},
	}

	handler := rest.NewUIAPIHandler(nil, nil, nil)
	handler.HandleListInfo(c)

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

func TestUIAPIHandler_HandleListInfo_MissingListViewName(t *testing.T) {
	w := httptest.NewRecorder()
	c, _ := gin.CreateTestContext(w)
	c.Request = httptest.NewRequest("GET", "/ui-api/list-info/Account/", nil)
	c.Params = gin.Params{
		{Key: "objectApiName", Value: "Account"},
		{Key: "listViewApiName", Value: ""},
	}

	handler := rest.NewUIAPIHandler(nil, nil, nil)
	handler.HandleListInfo(c)

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