import type { Span } from '@opentelemetry/api';
import type { ArvoContract, ArvoEvent, ArvoOrchestratorContract, ArvoSemanticVersion, VersionedArvoContract } from 'arvo-core';
import type { AnyActorLogic } from 'xstate';
import { type EventValidationResult } from '../ArvoOrchestrationUtils/inputValidation';
/**
 * Represents an ArvoMachine object that can be consumed by an Arvo orchestrator.
 * ArvoMachine encapsulates the logic and metadata required for an Arvo-compatible
 * state machine. It combines XState's actor logic with Arvo-specific contracts
 * and versioning information.
 *
 * It is strongly recommended to use `setupArvoMachine(...).createMachine(...)`
 * instead of creating this object directly. The setup function provides additional
 * type safety and validation that helps prevent runtime errors.
 */
export default class ArvoMachine<TId extends string, TVersion extends ArvoSemanticVersion, TSelfContract extends VersionedArvoContract<ArvoOrchestratorContract, TVersion>, TServiceContract extends Record<string, VersionedArvoContract<ArvoContract, ArvoSemanticVersion>>, TLogic extends AnyActorLogic> {
    readonly id: TId;
    readonly version: TVersion;
    readonly contracts: {
        self: TSelfContract;
        services: TServiceContract;
    };
    readonly logic: TLogic;
    readonly requiresResourceLocking: boolean;
    constructor(id: TId, version: TVersion, contracts: {
        self: TSelfContract;
        services: TServiceContract;
    }, logic: TLogic, requiresResourceLocking?: boolean);
    /**
     * Gets the event type that this machine accepts, as defined in its contract.
     */
    get source(): TSelfContract['accepts']['type'];
    /**
     * Validates an event against the machine's contracts and data schemas.
     * Performs validation for both self-contract events and service contract events.
     *
     * @param event - The event to validate
     *
     * See {@link validateInputEvent} for more infromation
     */
    validateInput(event: ArvoEvent, span?: Span): EventValidationResult;
}
