import { IMessageParser, IMessageSerializer, IMessageRegistry, MessageDefinition, ParsedMAVLinkMessage, MAVLinkFrame } from './types.js';
import { MessageRegistry } from './message-registry.js';
import { MessageSerializer } from './message-serializer.js';

/**
 * Abstract base class for dialect-specific parsers.
 * Composes MessageRegistry and MessageSerializer for full functionality.
 */
declare abstract class DialectParser implements IMessageParser, IMessageSerializer, IMessageRegistry {
    protected readonly registry: MessageRegistry;
    protected readonly serializer: MessageSerializer;
    protected readonly dialectName: string;
    private readonly streamBuffer;
    constructor(dialectName: string);
    /**
     * Register a message definition
     */
    protected registerMessageDefinition(def: MessageDefinition, crcExtra: number): void;
    /**
     * Load message definitions - must be implemented by dialect-specific subclass
     */
    abstract loadDefinitions(): Promise<void>;
    /**
     * Parse incoming bytes and return any complete messages
     */
    parseBytes(data: Uint8Array): ParsedMAVLinkMessage[];
    /**
     * Decode a MAVLink frame into a parsed message
     */
    decode(frame: MAVLinkFrame): ParsedMAVLinkMessage;
    /**
     * Clear the internal buffer
     */
    resetBuffer(): void;
    /**
     * Serialize a message to MAVLink bytes
     */
    serializeMessage(message: Record<string, unknown> & {
        message_name: string;
    }): Uint8Array;
    /**
     * Complete a message with default values for all undefined fields
     */
    completeMessage(message: Record<string, unknown> & {
        message_name: string;
    }): Record<string, unknown>;
    /**
     * Get message definition by ID
     */
    getMessageDefinition(id: number): MessageDefinition | undefined;
    /**
     * Get message definition by name
     */
    getMessageDefinitionByName(name: string): MessageDefinition | undefined;
    /**
     * Check if a message ID is supported
     */
    supportsMessage(messageId: number): boolean;
    /**
     * Check if a message name is supported
     */
    supportsMessageName(messageName: string): boolean;
    /**
     * Get all supported message IDs
     */
    getSupportedMessageIds(): number[];
    /**
     * Get all supported message names
     */
    getSupportedMessageNames(): string[];
    /**
     * Get the dialect name
     */
    getDialectName(): string;
}

export { DialectParser };
