export type EntityType =
  | 'central_bank'
  | 'commercial_bank'
  | 'emi'
  | 'payment_institution'
  | 'custodian'
  | 'broker_dealer'
  | 'other';

export type RegulatoryStatus = 'licensed' | 'pending' | 'suspended' | 'offboarded';

export type RiskTier = 'low' | 'medium' | 'high' | 'prohibited';

export type EntityCapability =
  | 'payment_initiation'
  | 'settlement'
  | 'treasury'
  | 'digital_asset'
  | 'reporting'
  | 'identity'
  | 'reconciliation';

export type RegulatedEntity = {
  entityId: string;
  tenantId: string;
  legalName: string;
  jurisdiction: string;
  lei?: string;
  regulatoryStatus: RegulatoryStatus;
  entityType: EntityType;
  riskTier: RiskTier;
  enabledCapabilities: EntityCapability[];
  credentialRef?: string;
  contractualDocRefs?: string[];
  limits?: {
    dailyAmountLimit?: string;
    perTransactionLimit?: string;
    currency?: string;
  };
  offboardedAt?: string;
  metadata?: Record<string, string>;
};

export type RegulatedEntityRegistry = {
  entities: RegulatedEntity[];
  getEntity(entityId: string, tenantId: string): RegulatedEntity | undefined;
};

export function createInMemoryEntityRegistry(
  entities: RegulatedEntity[]
): RegulatedEntityRegistry {
  const index = new Map<string, RegulatedEntity>();
  for (const e of entities) {
    index.set(`${e.tenantId}:${e.entityId}`, e);
  }
  return {
    entities,
    getEntity(entityId, tenantId) {
      return index.get(`${tenantId}:${entityId}`);
    },
  };
}

export function assertTenantIsolation(
  actorTenantId: string,
  resourceTenantId: string
): void {
  if (actorTenantId !== resourceTenantId) {
    throw new Error('Tenant isolation violation');
  }
}
