/**
 * Official Type definitions for the LemonadeJS plugins
 * https://lemonadejs.net
 * Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
 */
import React from 'react';
import Timeline from './index';

declare namespace TimelineReact {
    /**
     * React-idiomatic camelCase aliases for the lemonadejs callbacks. The
     * wrapper drops the leading `self` argument before invoking these — the
     * instance is available via the forwarded ref.
     *
     * The lowercase names from `Timeline.Options` (e.g. `onupdate`) still
     * work for legacy compatibility, but new code should prefer these.
     */
    interface ReactCallbacks {
        /** Fired after `result` is recomputed (initial render + every change). */
        onUpdate?: (result: Timeline.Item[]) => void;
        /** Fired when the edit icon is clicked on an `editable` item. */
        onEdition?: (entry: Timeline.Item) => void;
    }

    /** Wrapper-only props (the wrapping `<div>` accepts these). */
    interface DOMProps {
        className?: string;
        style?: React.CSSProperties;
        children?: React.ReactNode;
    }

    /**
     * Re-export the underlying type namespace so consumers writing
     *   import { Timeline } from '@lemonadejs/timeline/react';
     *   import type { Timeline as TimelineNS } from '@lemonadejs/timeline/react';
     * get `TimelineNS.Item`, `TimelineNS.ItemInput`, `TimelineNS.Tag`,
     * `TimelineNS.Options`, `TimelineNS.Instance` directly off the React
     * import. Same for the `@calendarjs/react` aggregate.
     */
    export type Item = Timeline.Item;
    export type ItemInput = Timeline.ItemInput;
    export type Tag = Timeline.Tag;
    export type Options = Timeline.Options;
    export type Instance = Timeline.Instance;
}

// Interface (not const) so the value type declaration-merges with the
// namespace above. That merge carries the type members along with the
// React component value when the default export is re-exported.
interface TimelineReact extends React.MemoExoticComponent<
    React.ForwardRefExoticComponent<
        Omit<Timeline.Options, 'onupdate' | 'onedition'>
        & TimelineReact.ReactCallbacks
        & TimelineReact.DOMProps
        & React.RefAttributes<Timeline.Instance>
    >
> {}

declare const TimelineReact: TimelineReact;

export default TimelineReact;
