package catalogtenant

import "context"

const authorityFenceKey = "TENANT_LAYOUT_BUNDLE_AUTHORITY"

var schemaStatements = []string{
	`CREATE TABLE IF NOT EXISTS _System_CatalogTenantAuthorityFence (
FenceKey VARCHAR(64) PRIMARY KEY, CommandSequence DECIMAL(20,0) NOT NULL,
CreatedDate DATETIME(6) NOT NULL, LastModifiedDate DATETIME(6) NOT NULL,
CONSTRAINT chk_catalog_tenant_authority_fence_key CHECK (
FenceKey = 'TENANT_LAYOUT_BUNDLE_AUTHORITY'))`,
	`INSERT IGNORE INTO _System_CatalogTenantAuthorityFence
(FenceKey, CommandSequence, CreatedDate, LastModifiedDate)
VALUES ('TENANT_LAYOUT_BUNDLE_AUTHORITY', 0, CURRENT_TIMESTAMP(6), CURRENT_TIMESTAMP(6))`,
	`CREATE TABLE IF NOT EXISTS _System_CatalogTenantAuthorityCommand (
CommandId CHAR(36) PRIMARY KEY, CommandKind VARCHAR(16) NOT NULL,
RequestDigest VARCHAR(71) NOT NULL, Result VARCHAR(40) NOT NULL,
ObservedPriorPresent BOOLEAN NOT NULL, ObservedPriorDigest VARCHAR(71) NULL,
ResultingValuePresent BOOLEAN NOT NULL, ResultingValueDigest VARCHAR(71) NULL,
ObservedNamespacePresent BOOLEAN NOT NULL, ObservedNamespaceDigest VARCHAR(71) NULL,
ObservedBindingPresent BOOLEAN NOT NULL, ObservedBindingDigest VARCHAR(71) NULL,
CommandSequence DECIMAL(20,0) NOT NULL, OutcomeDigest VARCHAR(71) NOT NULL,
CreatedDate DATETIME(6) NOT NULL,
UNIQUE KEY ux_catalog_tenant_command_sequence (CommandSequence),
UNIQUE KEY ux_catalog_tenant_command_outcome (OutcomeDigest),
CONSTRAINT chk_catalog_tenant_command_kind CHECK (
CommandKind IN ('NAMESPACE','ORG_BINDING','SLOT')),
CONSTRAINT chk_catalog_tenant_command_result CHECK (
Result IN ('APPLIED','EXPECTED_PRIOR_MISMATCH',
'NAMESPACE_DEPENDENCY_MISMATCH','BINDING_DEPENDENCY_MISMATCH',
'ACTIVE_BINDING','ACTIVE_SLOT')),
CONSTRAINT chk_catalog_tenant_command_prior CHECK (
(ObservedPriorPresent = FALSE AND ObservedPriorDigest IS NULL) OR
(ObservedPriorPresent = TRUE AND ObservedPriorDigest IS NOT NULL)),
CONSTRAINT chk_catalog_tenant_command_resulting CHECK (
(ResultingValuePresent = FALSE AND ResultingValueDigest IS NULL) OR
(ResultingValuePresent = TRUE AND ResultingValueDigest IS NOT NULL)),
CONSTRAINT chk_catalog_tenant_command_namespace CHECK (
(ObservedNamespacePresent = FALSE AND ObservedNamespaceDigest IS NULL) OR
(ObservedNamespacePresent = TRUE AND ObservedNamespaceDigest IS NOT NULL)),
CONSTRAINT chk_catalog_tenant_command_binding CHECK (
(ObservedBindingPresent = FALSE AND ObservedBindingDigest IS NULL) OR
(ObservedBindingPresent = TRUE AND ObservedBindingDigest IS NOT NULL)))`,
	`CREATE TABLE IF NOT EXISTS _System_CatalogTenantNamespaceReservation (
TenantNamespaceId VARBINARY(128) PRIMARY KEY,
ValueVersion VARCHAR(80) NOT NULL, State VARCHAR(16) NOT NULL,
ValueDigest VARCHAR(71) NOT NULL, LastCommandId CHAR(36) NOT NULL,
CreatedDate DATETIME(6) NOT NULL, LastModifiedDate DATETIME(6) NOT NULL,
CONSTRAINT chk_catalog_tenant_namespace_state CHECK (
State IN ('ACTIVE','TOMBSTONE')))`,
	`CREATE TABLE IF NOT EXISTS _System_CatalogTenantNamespaceHistory (
CommandId CHAR(36) PRIMARY KEY, CommandSequence DECIMAL(20,0) NOT NULL,
TenantNamespaceId VARBINARY(128) NOT NULL, ValueVersion VARCHAR(80) NOT NULL,
State VARCHAR(16) NOT NULL, ValueDigest VARCHAR(71) NOT NULL,
PriorValueDigest VARCHAR(71) NULL, CreatedDate DATETIME(6) NOT NULL,
UNIQUE KEY ux_catalog_tenant_namespace_history_value
(TenantNamespaceId, ValueDigest),
UNIQUE KEY ux_catalog_tenant_namespace_history_sequence (CommandSequence),
CONSTRAINT chk_catalog_tenant_namespace_history_state CHECK (
(State = 'ACTIVE' AND PriorValueDigest IS NULL) OR
(State = 'TOMBSTONE' AND PriorValueDigest IS NOT NULL)))`,
	`CREATE TABLE IF NOT EXISTS _System_CatalogTenantOrgNamespaceBinding (
OrgId VARBINARY(255) PRIMARY KEY, TenantNamespaceId VARBINARY(128) NOT NULL,
ValueVersion VARCHAR(80) NOT NULL, State VARCHAR(16) NOT NULL,
ValueDigest VARCHAR(71) NOT NULL, LastCommandId CHAR(36) NOT NULL,
CreatedDate DATETIME(6) NOT NULL, LastModifiedDate DATETIME(6) NOT NULL,
INDEX idx_catalog_tenant_binding_namespace (TenantNamespaceId, State),
CONSTRAINT chk_catalog_tenant_binding_state CHECK (
State IN ('ACTIVE','TOMBSTONE')))`,
	`CREATE TABLE IF NOT EXISTS _System_CatalogTenantOrgNamespaceBindingHistory (
CommandId CHAR(36) PRIMARY KEY, CommandSequence DECIMAL(20,0) NOT NULL,
OrgId VARBINARY(255) NOT NULL, TenantNamespaceId VARBINARY(128) NOT NULL,
ValueVersion VARCHAR(80) NOT NULL, State VARCHAR(16) NOT NULL,
ValueDigest VARCHAR(71) NOT NULL, PriorValueDigest VARCHAR(71) NULL,
CreatedDate DATETIME(6) NOT NULL,
UNIQUE KEY ux_catalog_tenant_binding_history_value (OrgId, ValueDigest),
UNIQUE KEY ux_catalog_tenant_binding_history_sequence (CommandSequence),
CONSTRAINT chk_catalog_tenant_binding_history_state CHECK (
(State = 'ACTIVE' AND PriorValueDigest IS NULL) OR
(State = 'TOMBSTONE' AND PriorValueDigest IS NOT NULL)))`,
	`CREATE TABLE IF NOT EXISTS _System_CatalogTenantLayoutBundleSlot (
TenantNamespaceId VARBINARY(128) NOT NULL,
LocalComponentKey VARBINARY(71) NOT NULL,
BundleKeyVersion VARCHAR(64) NOT NULL, SlotOwnerKind VARCHAR(8) NOT NULL,
ValueVersion VARCHAR(80) NOT NULL, State VARCHAR(16) NOT NULL,
ValueDigest VARCHAR(71) NOT NULL, LastCommandId CHAR(36) NOT NULL,
CreatedDate DATETIME(6) NOT NULL, LastModifiedDate DATETIME(6) NOT NULL,
PRIMARY KEY (TenantNamespaceId, LocalComponentKey),
INDEX idx_catalog_tenant_slot_namespace_state (TenantNamespaceId, State),
CONSTRAINT chk_catalog_tenant_slot_owner CHECK (SlotOwnerKind = 'tenant'),
CONSTRAINT chk_catalog_tenant_slot_state CHECK (
State IN ('ACTIVE','TOMBSTONE')))`,
	`CREATE TABLE IF NOT EXISTS _System_CatalogTenantLayoutBundleSlotHistory (
CommandId CHAR(36) PRIMARY KEY, CommandSequence DECIMAL(20,0) NOT NULL,
TenantNamespaceId VARBINARY(128) NOT NULL,
LocalComponentKey VARBINARY(71) NOT NULL,
BundleKeyVersion VARCHAR(64) NOT NULL, SlotOwnerKind VARCHAR(8) NOT NULL,
ValueVersion VARCHAR(80) NOT NULL, State VARCHAR(16) NOT NULL,
ValueDigest VARCHAR(71) NOT NULL, PriorValueDigest VARCHAR(71) NULL,
CreatedDate DATETIME(6) NOT NULL,
UNIQUE KEY ux_catalog_tenant_slot_history_value
(TenantNamespaceId, LocalComponentKey, ValueDigest),
UNIQUE KEY ux_catalog_tenant_slot_history_sequence (CommandSequence),
CONSTRAINT chk_catalog_tenant_slot_history_owner CHECK (
SlotOwnerKind = 'tenant'),
CONSTRAINT chk_catalog_tenant_slot_history_state CHECK (
(State = 'ACTIVE' AND PriorValueDigest IS NULL) OR
(State = 'TOMBSTONE' AND PriorValueDigest IS NOT NULL)))`,
}

// EnsureSchema creates only the dormant tenant-authority command, current
// value, and immutable history tables. It is not called by a production
// startup path.
func (a *Authority) EnsureSchema(ctx context.Context) error {
	for _, statement := range schemaStatements {
		if _, err := a.db.ExecContext(ctx, statement); err != nil {
			return err
		}
	}
	return nil
}

// SchemaStatementsForTest returns a defensive copy.
func SchemaStatementsForTest() []string {
	return append([]string(nil), schemaStatements...)
}
