package feishu

import (
	"context"
	"encoding/json"
	"net/http"
	"testing"
	"time"

	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
)

func TestGetNewInstances_Pagination(t *testing.T) {
	// We expect 3 calls (Page 1, Page 2, Page 3/Empty or just 2 pages with HasMore=false on 2nd)
	// Let's simulate 2 pages.
	// Page 1: 2 items, HasMore=true, PageToken="token_page_2"
	// Page 2: 1 item, HasMore=false, PageToken=""

	handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		if r.URL.Path == "/open-apis/auth/v3/tenant_access_token/internal" {
			resp := tokenResponse{
				Code:              0,
				TenantAccessToken: "test_token",
				Expire:            7200,
			}
			json.NewEncoder(w).Encode(resp)
			return
		}

		assert.Contains(t, r.URL.Path, "/open-apis/approval/v4/instances")
		assert.Equal(t, "GET", r.Method)

		query := r.URL.Query()
		pageToken := query.Get("page_token")

		var instanceList []string
		var nextToken string
		var hasMore bool

		if pageToken == "" {
			// First Page
			instanceList = []string{"INSTANCE-101", "INSTANCE-102"}
			nextToken = "token_page_2"
			hasMore = true
		} else if pageToken == "token_page_2" {
			// Second Page
			instanceList = []string{"INSTANCE-103"}
			nextToken = ""
			hasMore = false
		} else {
			t.Errorf("Unexpected page token: %s", pageToken)
			return
		}

		resp := instanceListResponse{
			Code: 0,
			Msg:  "success",
			Data: struct {
				InstanceCodeList []string `json:"instance_code_list"`
				PageToken        string   `json:"page_token"`
				HasMore          bool     `json:"has_more"`
			}{
				InstanceCodeList: instanceList,
				PageToken:        nextToken,
				HasMore:          hasMore,
			},
		}
		w.Header().Set("Content-Type", "application/json")
		json.NewEncoder(w).Encode(resp)
	})

	client, server := createTestClient(t, handler)
	defer server.Close()

	ctx := context.Background()
	startTime := time.Now().Add(-30 * time.Minute)
	endTime := time.Now()

	instances, err := client.GetNewInstances(ctx, startTime, endTime)

	require.NoError(t, err)
	assert.Len(t, instances, 3)
	assert.Contains(t, instances, "INSTANCE-101")
	assert.Contains(t, instances, "INSTANCE-102")
	assert.Contains(t, instances, "INSTANCE-103")
}
