package runtimeproduction

import (
	"encoding/json"
	"os"
	"reflect"
	"slices"
	"testing"

	permissionsemantic "github.com/pingcap-inc/nexuscrm-contract/pkg/runtime/effectivepermissionsv1"
	outboundintentsemantic "github.com/pingcap-inc/nexuscrm-contract/pkg/runtime/outboundintentv1"
	permissionauthoringsemantic "github.com/pingcap-inc/nexuscrm-contract/pkg/runtime/permissionauthoringv1"
)

func TestReleaseHostCompatibilityMatchesServingComposition(t *testing.T) {
	t.Parallel()
	type protocol struct {
		ProtocolID string `json:"protocolId"`
		Major      int    `json:"major"`
		Minor      int    `json:"minor"`
	}
	type manifest struct {
		Schema             string     `json:"schema"`
		Protocols          []protocol `json:"protocols"`
		EngineCapabilities []string   `json:"engineCapabilities"`
	}
	raw, err := os.ReadFile("host-compatibility.json")
	if err != nil {
		t.Fatal(err)
	}
	var got manifest
	if err := json.Unmarshal(raw, &got); err != nil {
		t.Fatal(err)
	}
	if got.Schema != "nexuscrm.runtime-host-compatibility/v1" {
		t.Fatalf("schema = %q", got.Schema)
	}
	if !reflect.DeepEqual(got.Protocols, []protocol{{ProtocolID: "nexuscrm.runtime.v1", Major: 1, Minor: 0}}) {
		t.Fatalf("protocols = %#v", got.Protocols)
	}
	if !reflect.DeepEqual(got.EngineCapabilities, productionRuntimeCapabilities()) {
		t.Fatalf("engine capabilities = %v, want the exact production serving capability set", got.EngineCapabilities)
	}
	if !slices.Contains(
		got.EngineCapabilities,
		outboundintentsemantic.MailAttachmentDeliveryCapabilityName,
	) {
		t.Fatal("host compatibility omits the complete mail attachment delivery feature")
	}
	if _, selectable := productionRuntimeCapabilityDefinition(
		outboundintentsemantic.MailAttachmentDeliveryCapabilityName,
	); selectable {
		t.Fatal("mail attachment delivery feature must not become a second selectable Runtime service")
	}
	if !slices.Contains(got.EngineCapabilities, permissionauthoringsemantic.RecordTypeObjectGroupsCapabilityName) {
		t.Fatal("host compatibility omits the Permission Authoring object-group semantic fence")
	}
	if !slices.Contains(got.EngineCapabilities, permissionsemantic.FieldCreateCapabilityName) {
		t.Fatal("host compatibility omits resolved field creation permission support")
	}
	if _, selectable := productionRuntimeCapabilityDefinition(permissionsemantic.FieldCreateCapabilityName); selectable {
		t.Fatal("field creation permission feature must not become a second Runtime service")
	}
	if _, selectable := productionRuntimeCapabilityDefinition(
		permissionauthoringsemantic.RecordTypeObjectGroupsCapabilityName,
	); selectable {
		t.Fatal("Permission Authoring semantic fence must not become a second selectable Runtime service")
	}
}
