package persistence

import (
	"context"
	"testing"

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

type historyTestExecutor struct{ Executor }

func TestBatchFieldMetadataUpsertCannotWriteExistingTrackHistory(t *testing.T) {
	for _, field := range batchFieldMetadataUpdatableFields() {
		if field == constants.FieldSysField_TrackHistory || field == constants.FieldSysField_HistoryTrackingRevision {
			t.Fatalf("generic batch upsert contains CAS-owned field %s", field)
		}
	}
	for _, field := range batchFieldMetadataGuardedFields() {
		if field == constants.FieldSysField_TrackHistory || field == constants.FieldSysField_HistoryTrackingRevision {
			t.Fatalf("generic guarded upsert contains CAS-owned field %s", field)
		}
	}
}

func TestBatchSaveFieldMetadataWithCustomizationPolicyRequiresTransaction(t *testing.T) {
	repo := NewSchemaRepository(nil, nil)
	err := repo.BatchSaveFieldMetadataWithCustomizationPolicy(context.Background(), []schema.FieldWithContext{{
		TableName:        "Account",
		ObjectID:         "obj-account",
		FieldID:          "fld-name",
		ColumnDefinition: schema.ColumnDefinition{Name: "Name", Type: "VARCHAR(255)"},
		Field:            &models.FieldMetadata{APIName: "Name"},
	}}, nil, false)
	if err == nil {
		t.Fatal("BatchSaveFieldMetadataWithCustomizationPolicy() error = nil, want active-tx rejection")
	}
}

func historyBatchFieldCandidate(fieldID string, tracked bool) schema.FieldWithContext {
	return schema.FieldWithContext{
		TableName:        "Account",
		ObjectID:         "obj-account",
		FieldID:          fieldID,
		ColumnDefinition: schema.ColumnDefinition{Name: "Name", Type: "VARCHAR(255)", Nullable: true},
		Field: &models.FieldMetadata{
			ID: fieldID, APIName: "Name", Label: "Name", Type: constants.FieldTypeString, TrackHistory: tracked,
		},
	}
}
