package queryv1

import (
	"errors"
	"strings"
	"testing"
)

func TestQueryResponseAboveFormerOneMiBLimit(t *testing.T) {
	text := strings.Repeat("x", 2*1024*1024)
	response := Response{TotalSize: 1, Done: true,
		Receipts: Receipts{ProtocolVersion: "1.0", CapabilityVersion: CapabilityName},
		Records:  []Record{{ObjectID: "Issue", Fields: []Field{{Name: "Description", Value: Value{Kind: ValueString, String: &text}}}}},
	}
	if err := ValidateResponse(response); err != nil {
		t.Fatalf("a two-MiB value must fit the larger query budget: %v", err)
	}
}

func TestQueryResponseExactByteLimit(t *testing.T) {
	text := ""
	response := Response{TotalSize: 1, Done: true,
		Receipts: Receipts{ProtocolVersion: "1.0", CapabilityVersion: CapabilityName},
		Records:  []Record{{ObjectID: "Issue", Fields: []Field{{Name: "Description", Value: Value{Kind: ValueString, String: &text}}}}},
	}
	size, err := SemanticResponseSize(response)
	if err != nil {
		t.Fatal(err)
	}
	text = strings.Repeat("x", MaxSemanticResponseBytes-size)
	size, err = SemanticResponseSize(response)
	if err != nil || size != MaxSemanticResponseBytes {
		t.Fatalf("boundary size=%d error=%v", size, err)
	}
	if err := ValidateResponse(response); err != nil {
		t.Fatalf("exact boundary rejected: %v", err)
	}
	text += "x"
	assertResponseByteFailure(t, ValidateResponse(response))
}

func TestQueryHistoryResponseExactByteLimit(t *testing.T) {
	text := ""
	response := HistoryResponse{TotalSize: 1, Done: true,
		Receipts: Receipts{ProtocolVersion: "1.0", CapabilityVersion: CapabilityName},
		Rows: []HistoryRow{{ID: "H1", ParentID: "I1", Field: "Description", NewValue: &text,
			DataType: "string", CreatedDate: "2026-09-08T00:00:00Z", CreatedByID: "U1"}},
	}
	size, err := SemanticHistoryResponseSize(response)
	if err != nil {
		t.Fatal(err)
	}
	text = strings.Repeat("x", MaxSemanticResponseBytes-size)
	size, err = SemanticHistoryResponseSize(response)
	if err != nil || size != MaxSemanticResponseBytes {
		t.Fatalf("boundary size=%d error=%v", size, err)
	}
	if err := ValidateHistoryResponse(response); err != nil {
		t.Fatalf("exact boundary rejected: %v", err)
	}
	text += "x"
	assertResponseByteFailure(t, ValidateHistoryResponse(response))
}

func assertResponseByteFailure(t *testing.T, err error) {
	t.Helper()
	var failure *Failure
	if !errors.As(err, &failure) || failure.Category != FailureResourceExhausted ||
		failure.LimitKind != LimitSemanticResponse || failure.Maximum != MaxSemanticResponseBytes {
		t.Fatalf("one-byte overflow must report the serving byte limit: %#v, %v", failure, err)
	}
}
