import { MemberNode } from '@humanwhocodes/momoa';
import { ObjectTitle, ElementTitle, Element, Attribute, ObjectNode } from '@lottiefiles/last';
import { VFile } from 'vfile';
import { ParseOptions } from './options.js';

/**
 * Copyright 2024 Design Barn Inc.
 */

interface SlotPropertyInfo {
    /**
     * SlotProperty node in the JsonAST
     */
    jsonNode: MemberNode;
    /**
     * SlotProperty node in the LottieAST
     */
    node: Element;
}
declare type SlotIdParentTitle = ObjectTitle | ElementTitle;
declare class Slots {
    /**
     * SlotID.value to ParentTitle mapping
     */
    idTitles: Map<string, SlotIdParentTitle>;
    /**
     * Copy of all the SlotProperty nodes
     */
    slotProperties: SlotPropertyInfo[];
    /**
     * Parser's VFile instance
     */
    private readonly _file;
    /**
     * Parser's options
     */
    private readonly _options;
    constructor(vfile: VFile, options: ParseOptions);
    /**
     * Mutates SlotProperty node titles based on the SlotID value and its parent title
     *
     * @returns void
     */
    mutateNodeTitles(): void;
    /**
     * Collects SlotIdNode value and its parent title
     *
     * @param node - SlotID node
     * @param parentNode - SlotID parent node
     * @returns void
     * @throws
     * - collects vfile message if slotPropertyNode.value is not a string
     * - collects vfile message if slotPropertyNode.value is already defined with a different title
     */
    setIdTitle(node: Attribute, parentNode: ObjectNode): void;
    /**
     * Collects SlotProperty nodes
     *
     * @param node - SlotProperty node
     * @param parent - SlotProperty parent node
     * @param jsonNode - SlotProperty node in the JsonAST
     * @returns void
     */
    setNode(node: Element, parent: ObjectNode, jsonNode: MemberNode): void;
}

export { Slots };
