package installation

import (
	"bytes"
	"context"
	"database/sql"
	"errors"
	"reflect"
	"strings"
	"testing"

	"github.com/tidbcloud/AgentTeam/internal/coredb"
)

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

	queryer := &recordingLockQueryer{rows: []coredb.Row{
		scriptedRow{values: []any{
			" 1.2.3 ",
			" https://example.com/callback ",
			[]byte(` {"capabilities":{"runtime":{"transports":["sse"]}}} `),
		}},
	}}
	payload, err := LoadServiceInstallationMetadata(context.Background(), queryer, " app-1 ", " 1.2.3 ")
	if err != nil {
		t.Fatalf("LoadServiceInstallationMetadata returned error: %v", err)
	}
	want := []byte(`{"version":"1.2.3","callbackURL":"https://example.com/callback","manifest":{"capabilities":{"runtime":{"transports":["sse"]}}}}`)
	if !bytes.Equal(payload, want) {
		t.Fatalf("metadata = %s, want %s", payload, want)
	}
	if got, want := len(queryer.queries), 1; got != want {
		t.Fatalf("query count = %d, want %d", got, want)
	}
	query := queryer.queries[0]
	if !strings.Contains(query, "FROM extension_definition_versions version") || strings.Contains(query, "JOIN service_definitions") {
		t.Fatalf("exact-version query changed shape:\n%s", query)
	}
	if got, want := queryer.args[0], []any{"app-1", "1.2.3"}; !reflect.DeepEqual(got, want) {
		t.Fatalf("query args = %#v, want %#v", got, want)
	}
}

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

	queryer := &recordingLockQueryer{rows: []coredb.Row{
		scriptedRow{values: []any{" latest ", " ", []byte(" ")}},
	}}
	payload, err := LoadServiceInstallationMetadata(context.Background(), queryer, " app-1 ", " ")
	if err != nil {
		t.Fatalf("LoadServiceInstallationMetadata returned error: %v", err)
	}
	if got, want := payload, []byte(`{"version":"latest"}`); !bytes.Equal(got, want) {
		t.Fatalf("metadata = %s, want %s", got, want)
	}
	if got, want := len(queryer.queries), 1; got != want {
		t.Fatalf("query count = %d, want %d", got, want)
	}
	query := queryer.queries[0]
	if !strings.Contains(query, "JOIN extension_definition_versions version") || !strings.Contains(query, "version.version = app.latest_version") {
		t.Fatalf("latest-version query changed shape:\n%s", query)
	}
	if got, want := queryer.args[0], []any{"app-1"}; !reflect.DeepEqual(got, want) {
		t.Fatalf("query args = %#v, want %#v", got, want)
	}
}

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

	notFound := &recordingLockQueryer{rows: []coredb.Row{scriptedRow{err: sql.ErrNoRows}}}
	if _, err := LoadServiceInstallationMetadata(context.Background(), notFound, "app-1", "1.0.0"); !errors.Is(err, ErrNotFound) {
		t.Fatalf("not-found error = %v, want ErrNotFound", err)
	}

	readFailure := errors.New("read failed")
	failed := &recordingLockQueryer{rows: []coredb.Row{scriptedRow{err: readFailure}}}
	_, err := LoadServiceInstallationMetadata(context.Background(), failed, "app-1", "1.0.0")
	if got, want := err.Error(), "load service installation version metadata: read failed"; got != want {
		t.Fatalf("error = %q, want %q", got, want)
	}
}
