package metadata

import (
	"testing"

	"github.com/nexuscrm/shared/pkg/constants"
	"github.com/nexuscrm/shared/pkg/models"
)

func TestValidateFieldMetadataAcceptsImmutableAfterCreateWriteProtection(t *testing.T) {
	vs := &ValidationService{}
	err := vs.validateFieldMetadata(&models.FieldMetadata{
		APIName:               "InitialValue__c",
		Type:                  constants.FieldTypeString,
		WriteProtectionPolicy: constants.FieldWriteProtectionImmutableAfterCreate,
	}, nil)
	if err != nil {
		t.Fatalf("validateFieldMetadata rejected immutable-after-create: %v", err)
	}
}

func TestValidateFieldMetadataRejectsCatalogAuthorityPolicy(t *testing.T) {
	vs := &ValidationService{}
	err := vs.validateFieldMetadata(&models.FieldMetadata{
		APIName:               "AuthorityValue__c",
		Type:                  constants.FieldTypeString,
		WriteProtectionPolicy: constants.FieldWriteProtectionAuthorityOnly,
	}, nil)
	if err == nil {
		t.Fatal("validateFieldMetadata accepted catalog-owned authority policy")
	}
}

func TestValidateFieldMetadataAcceptsUnchangedCatalogAuthorityPolicy(t *testing.T) {
	vs := &ValidationService{}
	existing := &models.FieldMetadata{
		APIName:               "WriteProtectionPolicy",
		Type:                  constants.FieldTypeString,
		WriteProtectionPolicy: constants.FieldWriteProtectionAuthorityOnly,
	}
	updated := *existing
	updated.Label = "Write Protection Policy"
	if err := vs.validateFieldMetadata(&updated, existing); err != nil {
		t.Fatalf("validateFieldMetadata rejected unchanged catalog authority policy: %v", err)
	}
}

func TestValidateFieldMetadataRejectsCatalogAuthorityDowngrade(t *testing.T) {
	vs := &ValidationService{}
	existing := &models.FieldMetadata{
		APIName:               "WriteProtectionPolicy",
		Type:                  constants.FieldTypeString,
		WriteProtectionPolicy: constants.FieldWriteProtectionAuthorityOnly,
	}
	updated := *existing
	updated.WriteProtectionPolicy = constants.FieldWriteProtectionTrustedOnly
	if err := vs.validateFieldMetadata(&updated, existing); err == nil {
		t.Fatal("validateFieldMetadata accepted a catalog authority downgrade")
	}
}
