package org

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

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

	"github.com/tidbcloud/AgentTeam/internal/api"
	"github.com/tidbcloud/AgentTeam/internal/api/dto"
	"github.com/tidbcloud/AgentTeam/internal/store/identity"
	"github.com/tidbcloud/AgentTeam/internal/store/organization"
)

type settingsOrganizationProvider struct {
	routeOrganizationProvider

	userID         string
	organizationID string
	params         organization.UpdateOrganizationSettingsParams
}

func (provider *settingsOrganizationProvider) PatchOrganizationSettingsForUser(_ context.Context, userID string, organizationID string, params organization.UpdateOrganizationSettingsParams) (organization.OrganizationSettingsView, error) {
	provider.userID = userID
	provider.organizationID = organizationID
	provider.params = params
	return organization.OrganizationSettingsView{OrganizationID: organizationID}, nil
}

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

	provider := &settingsOrganizationProvider{}
	handler := &SettingsHandler{organizationHandlerBase: organizationHandlerBase{organizations: provider}}
	router := gin.New()
	router.PATCH("/api/v1/orgs/:orgId/settings", func(ctx *gin.Context) {
		api.SetAuthenticatedUser(ctx, identity.AuthenticatedUser{User: identity.User{ID: "usr_1"}})
	}, handleOrgAuthJSON[dto.OrganizationSettingsPatchRequest](handler.Patch))

	recorder := httptest.NewRecorder()
	body := `{"directoryBackend":"external_shadow","authProvider":"feishu","directoryProvider":"feishu","feishu":{"tenantKey":"tenant_1","rootDepartmentId":"dept_1"}}`
	request := httptest.NewRequest(http.MethodPatch, "/api/v1/orgs/org_1/settings", bytes.NewBufferString(body))
	request.Header.Set("Content-Type", "application/json")
	router.ServeHTTP(recorder, request)

	require.Equal(t, http.StatusOK, recorder.Code)
	require.Equal(t, "usr_1", provider.userID)
	require.Equal(t, "org_1", provider.organizationID)
	require.NotNil(t, provider.params.DirectoryBackend)
	require.Equal(t, "external_shadow", *provider.params.DirectoryBackend)
	require.NotNil(t, provider.params.AuthProvider)
	require.Equal(t, "feishu", *provider.params.AuthProvider)
	require.NotNil(t, provider.params.DirectoryProvider)
	require.Equal(t, "feishu", *provider.params.DirectoryProvider)
	require.NotNil(t, provider.params.Feishu)
	require.NotNil(t, provider.params.Feishu.TenantKey)
	require.Equal(t, "tenant_1", *provider.params.Feishu.TenantKey)
	require.NotNil(t, provider.params.Feishu.RootDepartmentID)
	require.Equal(t, "dept_1", *provider.params.Feishu.RootDepartmentID)
}
