import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { Tooltip } from '@material-ui/core';
import { action, computed, IReactionDisposer, observable, reaction, runInAction } from 'mobx';
import { observer } from 'mobx-react';
import { Doc, DocListCast, Opt } from '../../../../fields/Doc';
import { Height, Width } from '../../../../fields/DocSymbols';
import { Id } from '../../../../fields/FieldSymbols';
import { List } from '../../../../fields/List';
import { Cast, DocCast, NumCast, StrCast } from '../../../../fields/Types';
import { emptyFunction, returnEmptyDoclist, returnFalse, returnTrue, setupMoveUpEvents } from '../../../../Utils';
import { Docs } from '../../../documents/Documents';
import { CollectionViewType } from '../../../documents/DocumentTypes';
import { DocumentManager } from '../../../util/DocumentManager';
import { DragManager } from '../../../util/DragManager';
import { SettingsManager } from '../../../util/SettingsManager';
import { Transform } from '../../../util/Transform';
import { undoable, undoBatch } from '../../../util/UndoManager';
import { ViewBoxBaseComponent } from '../../DocComponent';
import { EditableView } from '../../EditableView';
import { Colors } from '../../global/globalEnums';
import { DocumentView, DocumentViewProps } from '../../nodes/DocumentView';
import { FieldView, FieldViewProps } from '../../nodes/FieldView';
import { StyleProp } from '../../StyleProvider';
import { PresBox } from './PresBox';
import './PresElementBox.scss';
import { PresMovement } from './PresEnums';
import React = require('react');
/**
 * This class models the view a document added to presentation will have in the presentation.
 * It involves some functionality for its buttons and options.
 */
@observer
export class PresElementBox extends ViewBoxBaseComponent<FieldViewProps>() {
    public static LayoutString(fieldKey: string) {
        return FieldView.LayoutString(PresElementBox, fieldKey);
    }
    _heightDisposer: IReactionDisposer | undefined;

    @observable _dragging = false;
    // Idea: this boolean will determine whether to automatically show the video when this preselement is selected.
    // @observable static showVideo: boolean = false;
    @computed get indexInPres() {
        return DocListCast(this.presBox?.[StrCast(this.presBox.presFieldKey, 'data')]).indexOf(this.rootDoc);
    } // the index field is where this document is in the presBox display list (since this value is different for each presentation element, the value can't be stored on the layout template which is used by all display elements)
    @computed get expandViewHeight() {
        return 100;
    }
    @computed get collapsedHeight() {
        return 35;
    } // the collapsed height changes depending on the state of the presBox.  We could store this on the presentation element template if it's used by only one presentation - but if it's shared by multiple, then this value must be looked up
    @computed get selectedArray() {
        return this.presBoxView?.selectedArray;
    }
    @computed get presBoxView() {
        return this.props.DocumentView?.()?.props.docViewPath().lastElement()?.ComponentView as PresBox;
    }
    @computed get presBox() {
        return this.props.DocumentView?.().props.docViewPath().lastElement()?.rootDoc;
    }
    @computed get targetDoc() {
        return Cast(this.rootDoc.presentation_targetDoc, Doc, null) || this.rootDoc;
    }

    componentDidMount() {
        this.layoutDoc.layout_hideLinkButton = true;
        this._heightDisposer = reaction(
            () => ({ expand: this.rootDoc.presentation_expandInlineButton, height: this.collapsedHeight }),
            ({ expand, height }) => (this.layoutDoc._height = height + (expand ? this.expandViewHeight : 0)),
            { fireImmediately: true }
        );
    }
    componentWillUnmount() {
        this._heightDisposer?.();
    }

    /**
     * Returns a local transformed coordinate array for given coordinates.
     */
    ScreenToLocalListTransform = (xCord: number, yCord: number) => [xCord, yCord];

    @action
    presExpandDocumentClick = () => (this.rootDoc.presentation_expandInlineButton = !this.rootDoc.presentation_expandInlineButton);

    embedHeight = (): number => this.collapsedHeight + this.expandViewHeight;
    // embedWidth = () => this.props.PanelWidth();
    // embedHeight = () => Math.min(this.props.PanelWidth() - 20, this.props.PanelHeight() - this.collapsedHeight);
    embedWidth = (): number => this.props.PanelWidth() / 2;
    styleProvider = (doc: Doc | undefined, props: Opt<DocumentViewProps>, property: string): any => {
        if (property === StyleProp.Opacity) return 1;
        return this.props.styleProvider?.(doc, props, property);
    };
    /**
     * The function that is responsible for rendering a preview or not for this
     * presentation element.
     */
    @computed get renderEmbeddedInline() {
        return !this.rootDoc.presentation_expandInlineButton || !this.targetDoc ? null : (
            <div className="presItem-embedded" style={{ height: this.embedHeight(), width: '50%' }}>
                <DocumentView
                    Document={PresBox.targetRenderedDoc(this.rootDoc)}
                    DataDoc={undefined} //this.targetDoc[DataSym] !== this.targetDoc && this.targetDoc[DataSym]}
                    PanelWidth={this.embedWidth}
                    PanelHeight={this.embedHeight}
                    isContentActive={this.props.isContentActive}
                    styleProvider={this.styleProvider}
                    hideLinkButton={true}
                    ScreenToLocalTransform={Transform.Identity}
                    renderDepth={this.props.renderDepth + 1}
                    docViewPath={returnEmptyDoclist}
                    childFilters={this.props.childFilters}
                    childFiltersByRanges={this.props.childFiltersByRanges}
                    searchFilterDocs={this.props.searchFilterDocs}
                    rootSelected={returnTrue}
                    addDocument={returnFalse}
                    removeDocument={returnFalse}
                    fitContentsToBox={returnTrue}
                    moveDocument={this.props.moveDocument!}
                    focus={emptyFunction}
                    whenChildContentsActiveChanged={returnFalse}
                    addDocTab={returnFalse}
                    pinToPres={returnFalse}
                    bringToFront={returnFalse}
                />
                {/* <div className="presItem-embeddedMask" /> */}
            </div>
        );
    }

    @computed get renderGroupSlides() {
        const childDocs = DocListCast(this.targetDoc.data);
        const groupSlides = childDocs.map((doc: Doc, ind: number) => (
            <div
                className="presItem-groupSlide"
                onClick={e => {
                    e.stopPropagation();
                    e.preventDefault();
                    this.presBoxView?.modifierSelect(doc, this._itemRef.current!, this._dragRef.current!, e.shiftKey || e.ctrlKey || e.metaKey, e.ctrlKey || e.metaKey, e.shiftKey);
                    this.presExpandDocumentClick();
                }}>
                <div className="presItem-groupNum">{`${ind + 1}.`}</div>
                <div className="presItem-name">
                    <EditableView
                        ref={this._titleRef}
                        editing={undefined}
                        contents={doc.title}
                        overflow={'ellipsis'}
                        GetValue={() => StrCast(doc.title)}
                        SetValue={(value: string) => {
                            doc.title = !value.trim().length ? '-untitled-' : value;
                            return true;
                        }}
                    />
                </div>
            </div>
        ));
        return groupSlides;
    }

    @computed get transition() {
        let transitionInS: number;
        if (this.rootDoc.presentation_transition) transitionInS = NumCast(this.rootDoc.presentation_transition) / 1000;
        else transitionInS = 0.5;
        return this.rootDoc.presentation_movement === PresMovement.Jump || this.rootDoc.presentation_movement === PresMovement.None ? null : 'M: ' + transitionInS + 's';
    }

    private _itemRef: React.RefObject<HTMLDivElement> = React.createRef();
    private _dragRef: React.RefObject<HTMLDivElement> = React.createRef();
    private _titleRef: React.RefObject<EditableView> = React.createRef();

    @action
    headerDown = (e: React.PointerEvent<HTMLDivElement>) => {
        const element = e.target as any;
        e.stopPropagation();
        e.preventDefault();
        if (element && !(e.ctrlKey || e.metaKey || e.button === 2)) {
            this.presBoxView?.regularSelect(this.rootDoc, this._itemRef.current!, this._dragRef.current!, true, false);
            setupMoveUpEvents(this, e, this.startDrag, emptyFunction, e => {
                e.stopPropagation();
                e.preventDefault();
                this.presBoxView?.modifierSelect(this.rootDoc, this._itemRef.current!, this._dragRef.current!, e.shiftKey || e.ctrlKey || e.metaKey, e.ctrlKey || e.metaKey, e.shiftKey);
                this.presBoxView?.activeItem && this.showRecording(this.presBoxView?.activeItem);
            });
        }
    };

    /**
     * Function to drag and drop the pres element to a diferent location
     */
    startDrag = (e: PointerEvent) => {
        const miniView: boolean = this.toolbarWidth <= 100;
        const activeItem = this.rootDoc;
        const dragArray = this.presBoxView?._dragArray ?? [];
        const dragData = new DragManager.DocumentDragData(this.presBoxView?.sortArray() ?? []);
        if (!dragData.draggedDocuments.length) dragData.draggedDocuments.push(this.rootDoc);
        dragData.treeViewDoc = this.presBox?._type_collection === CollectionViewType.Tree ? this.presBox : undefined; // this.props.DocumentView?.()?.props.treeViewDoc;
        dragData.moveDocument = this.props.moveDocument;
        const dragItem: HTMLElement[] = [];
        const classesToRestore = new Map<HTMLElement, string>();
        if (dragArray.length === 1) {
            const doc = this._itemRef.current || dragArray[0];
            if (doc) {
                classesToRestore.set(doc, doc.className);
                doc.className = miniView ? 'presItem-miniSlide' : 'presItem-slide';
                dragItem.push(doc);
            }
        } else if (dragArray.length >= 1) {
            const doc = document.createElement('div');
            doc.className = 'presItem-multiDrag';
            doc.innerText = 'Move ' + this.selectedArray?.size + ' slides';
            doc.style.position = 'absolute';
            doc.style.top = e.clientY + 'px';
            doc.style.left = e.clientX - 50 + 'px';
            dragItem.push(doc);
        }

        if (activeItem) {
            runInAction(() => (this._dragging = true));
            DragManager.StartDocumentDrag(
                dragItem.map(ele => ele),
                dragData,
                e.clientX,
                e.clientY,
                undefined,
                action(() => {
                    Array.from(classesToRestore).forEach(pair => (pair[0].className = pair[1]));
                    this._dragging = false;
                })
            );
            return true;
        }
        return false;
    };

    onPointerOver = (e: any) => {
        document.removeEventListener('pointermove', this.onPointerMove);
        document.addEventListener('pointermove', this.onPointerMove);
    };

    onPointerMove = (e: PointerEvent) => {
        const slide = this._itemRef.current!;
        const dragIsPresItem = DragManager.docsBeingDragged.some(d => d.presentation_targetDoc);
        if (slide && dragIsPresItem) {
            const rect = slide.getBoundingClientRect();
            const y = e.clientY - rect.top; //y position within the element.
            const height = slide.clientHeight;
            const halfLine = height / 2;
            if (y <= halfLine) {
                slide.style.borderTop = `solid 2px ${Colors.MEDIUM_BLUE}`;
                slide.style.borderBottom = '0px';
            } else if (y > halfLine) {
                slide.style.borderTop = '0px';
                slide.style.borderBottom = `solid 2px ${Colors.MEDIUM_BLUE}`;
            }
        }
        document.removeEventListener('pointermove', this.onPointerMove);
    };

    onPointerLeave = (e: any) => {
        this._itemRef.current!.style.borderTop = '0px';
        this._itemRef.current!.style.borderBottom = '0px';
        document.removeEventListener('pointermove', this.onPointerMove);
    };

    @action
    toggleProperties = () => {
        if (SettingsManager.propertiesWidth < 5) {
            action(() => (SettingsManager.propertiesWidth = 250));
        }
    };

    removePresentationItem = undoable((e: React.MouseEvent) => {
        e.stopPropagation();
        if (this.presBox && this.indexInPres < (this.presBoxView?.itemIndex || 0)) {
            runInAction(() => (this.presBox!.itemIndex = (this.presBoxView?.itemIndex || 0) - 1));
        }
        this.props.removeDocument?.(this.rootDoc);
        this.presBoxView?.removeFromSelectedArray(this.rootDoc);
        this.removeAllRecordingInOverlay();
    }, 'Remove doc from pres trail');

    // set the value/title of the individual pres element
    @undoBatch
    @action
    onSetValue = (value: string) => {
        this.rootDoc.title = !value.trim().length ? '-untitled-' : value;
        return true;
    };

    /**
     * Method called for updating the view of the currently selected document
     *
     * @param targetDoc
     * @param activeItem
     */
    @undoBatch
    @action
    updateCapturedContainerLayout = (presTargetDoc: Doc, activeItem: Doc) => {
        const targetDoc = DocCast(presTargetDoc.annotationOn) ?? presTargetDoc;
        activeItem.config_x = NumCast(targetDoc.x);
        activeItem.config_y = NumCast(targetDoc.y);
        activeItem.config_rotation = NumCast(targetDoc.rotation);
        activeItem.config_width = NumCast(targetDoc.width);
        activeItem.config_height = NumCast(targetDoc.height);
        activeItem.config_pinLayout = true;
    };
    /**
     * Method called for updating the view of the currently selected document
     *
     * @param presTargetDoc
     * @param activeItem
     */
    @undoBatch
    @action
    updateCapturedViewContents = (presTargetDoc: Doc, activeItem: Doc) => {
        const target = DocCast(presTargetDoc.annotationOn) ?? presTargetDoc;
        PresBox.pinDocView(activeItem, { pinData: PresBox.pinDataTypes(target) }, target);
    };

    @computed get recordingIsInOverlay() {
        return DocListCast(Doc.MyOverlayDocs.data).some(doc => doc.slides === this.rootDoc);
    }

    // a previously recorded video will have timecode defined
    static videoIsRecorded = (activeItem: Opt<Doc>) => {
        const casted = Cast(activeItem?.recording, Doc, null);
        return casted && 'layout_currentTimecode' in casted;
    };

    removeAllRecordingInOverlay = () => {
        DocListCast(Doc.MyOverlayDocs.data)
            .filter(doc => doc.slides === this.rootDoc)
            .forEach(Doc.RemFromMyOverlay);
    };

    static removeEveryExistingRecordingInOverlay = () => {
        // Remove every recording that already exists in overlay view
        DocListCast(Doc.MyOverlayDocs.data).forEach(doc => {
            if (doc.slides !== null) {
                // if it's a recording video, don't remove from overlay (user can lose data)
                if (PresElementBox.videoIsRecorded(DocCast(doc.slides))) {
                    Doc.RemFromMyOverlay(doc);
                }
            }
        });
    };

    @undoBatch
    @action
    hideRecording = (e: React.MouseEvent, iconClick: boolean = false) => {
        e.stopPropagation();
        this.removeAllRecordingInOverlay();
        // if (iconClick) PresElementBox.showVideo = false;
    };

    @undoBatch
    @action
    showRecording = (activeItem: Doc, iconClick: boolean = false) => {
        // remove the overlays on switch *IF* not opened from the specific icon
        if (!iconClick) PresElementBox.removeEveryExistingRecordingInOverlay();

        if (activeItem.recording) {
            Doc.AddToMyOverlay(DocCast(activeItem.recording));
        }
    };

    @undoBatch
    @action
    startRecording = (e: React.MouseEvent, activeItem: Doc) => {
        e.stopPropagation();
        if (PresElementBox.videoIsRecorded(activeItem)) {
            // if we already have an existing recording
            this.showRecording(activeItem, true);
            //   // if we already have an existing recording
            //   Doc.AddToMyOverlay(Cast(activeItem.recording, Doc, null));
        } else {
            // Remove every recording that already exists in overlay view
            // this is a design decision to clear to focus in on the recoding mode
            PresElementBox.removeEveryExistingRecordingInOverlay();

            // if we dont have any recording
            const recording = Docs.Create.WebCamDocument('', {
                _width: 384,
                _height: 216,
                layout_hideDocumentButtonBar: true,
                layout_hideDecorationTitle: true,
                layout_hideOpenButton: true,
                // hideDeleteButton: true,
                cloneFieldFilter: new List<string>(['isSystem']),
            });

            // attach the recording to the slide, and attach the slide to the recording
            recording.slides = activeItem;
            activeItem.recording = recording;

            // make recording box appear in the bottom right corner of the screen
            recording.overlayX = window.innerWidth - recording[Width]() - 20;
            recording.overlayY = window.innerHeight - recording[Height]() - 20;
            Doc.AddToMyOverlay(recording);
        }
    };

    @computed
    get toolbarWidth(): number {
        const presBoxDocView = DocumentManager.Instance.getDocumentView(this.presBox);
        let width: number = NumCast(this.presBox?._width);
        if (presBoxDocView) width = presBoxDocView.props.PanelWidth();
        if (width === 0) width = 300;
        return width;
    }

    @computed get presButtons() {
        const presBox = this.presBox; //presBox
        const presBoxColor: string = StrCast(presBox?._backgroundColor);
        const presColorBool: boolean = presBoxColor ? presBoxColor !== Colors.WHITE && presBoxColor !== 'transparent' : false;
        const targetDoc: Doc = this.targetDoc;
        const activeItem: Doc = this.rootDoc;

        const items: JSX.Element[] = [];
        items.push(
            <Tooltip key="slide" title={<div className="dash-tooltip">Update captured doc layout</div>}>
                <div
                    className="slideButton"
                    onPointerDown={e => setupMoveUpEvents(this, e, returnFalse, emptyFunction, () => this.updateCapturedContainerLayout(targetDoc, activeItem), true)}
                    style={{ opacity: activeItem.config_pinLayout ? 1 : 0.5, fontWeight: 700, display: 'flex' }}>
                    L
                </div>
            </Tooltip>
        );
        items.push(
            <Tooltip key="flex" title={<div className="dash-tooltip">Update captured doc content</div>}>
                <div
                    className="slideButton"
                    onPointerDown={e => setupMoveUpEvents(this, e, returnFalse, emptyFunction, () => this.updateCapturedViewContents(targetDoc, activeItem))}
                    style={{ opacity: activeItem.config_pinData || activeItem.config_pinView ? 1 : 0.5, fontWeight: 700, display: 'flex' }}>
                    C
                </div>
            </Tooltip>
        );
        items.push(
            <Tooltip key="slash" title={<div className="dash-tooltip">{this.recordingIsInOverlay ? 'Hide Recording' : `${PresElementBox.videoIsRecorded(activeItem) ? 'Show' : 'Start'} recording`}</div>}>
                <div className="slideButton" onClick={e => (this.recordingIsInOverlay ? this.hideRecording(e, true) : this.startRecording(e, activeItem))} style={{ fontWeight: 700 }}>
                    <FontAwesomeIcon icon={`video${this.recordingIsInOverlay ? '-slash' : ''}`} onPointerDown={e => e.stopPropagation()} />
                </div>
            </Tooltip>
        );
        if (this.indexInPres !== 0) {
            items.push(
                <Tooltip
                    key="arrow"
                    title={
                        <div className="dash-tooltip">
                            {!activeItem.presentation_groupWithUp
                                ? 'Not grouped with previous slide (click to group)'
                                : activeItem.presentation_groupWithUp === 1
                                ? 'Run simultaneously with previous slide (click again to run after)'
                                : 'Run after previous slide (click to ungroup from previous)'}
                        </div>
                    }>
                    <div
                        className="slideButton"
                        onClick={() => (activeItem.presentation_groupWithUp = (NumCast(activeItem.presentation_groupWithUp) + 1) % 3)}
                        style={{
                            zIndex: 1000 - this.indexInPres,
                            fontWeight: 700,
                            backgroundColor: activeItem.presentation_groupWithUp ? (presColorBool ? presBoxColor : Colors.MEDIUM_BLUE) : undefined,
                            outline: NumCast(activeItem.presentation_groupWithUp) > 1 ? 'solid black 1px' : undefined,
                            height: activeItem.presentation_groupWithUp ? 53 : 18,
                            transform: activeItem.presentation_groupWithUp ? 'translate(0, -17px)' : undefined,
                        }}>
                        <div style={{ transform: activeItem.presentation_groupWithUp ? 'rotate(180deg) translate(0, -17.5px)' : 'rotate(0deg)' }}>
                            <FontAwesomeIcon icon={'arrow-up'} onPointerDown={e => e.stopPropagation()} />
                        </div>
                    </div>
                </Tooltip>
            );
        }
        items.push(
            <Tooltip key="eye" title={<div className="dash-tooltip">{this.rootDoc.presentation_expandInlineButton ? 'Minimize' : 'Expand'}</div>}>
                <div
                    className="slideButton"
                    onClick={e => {
                        e.stopPropagation();
                        this.presExpandDocumentClick();
                    }}>
                    <FontAwesomeIcon icon={this.rootDoc.presentation_expandInlineButton ? 'eye-slash' : 'eye'} onPointerDown={e => e.stopPropagation()} />
                </div>
            </Tooltip>
        );
        items.push(
            <Tooltip key="trash" title={<div className="dash-tooltip">Remove from presentation</div>}>
                <div className={'slideButton'} onClick={this.removePresentationItem}>
                    <FontAwesomeIcon icon={'trash'} onPointerDown={e => e.stopPropagation()} />
                </div>
            </Tooltip>
        );
        return items;
    }

    @computed get mainItem() {
        const isSelected: boolean = this.selectedArray?.has(this.rootDoc) ? true : false;
        const isCurrent: boolean = this.presBox?._itemIndex === this.indexInPres;
        const miniView: boolean = this.toolbarWidth <= 110;
        const presBox = this.presBox; //presBox
        const presBoxColor: string = StrCast(presBox?._backgroundColor);
        const presColorBool: boolean = presBoxColor ? presBoxColor !== Colors.WHITE && presBoxColor !== 'transparent' : false;
        const activeItem: Doc = this.rootDoc;

        return (
            <div
                className={`presItem-container`}
                key={this.props.Document[Id] + this.indexInPres}
                ref={this._itemRef}
                style={{
                    backgroundColor: presColorBool ? (isSelected ? 'rgba(250,250,250,0.3)' : 'transparent') : isSelected ? Colors.LIGHT_BLUE : 'transparent',
                    opacity: this._dragging ? 0.3 : 1,
                    paddingLeft: NumCast(this.layoutDoc._xPadding, this.props.xPadding),
                    paddingRight: NumCast(this.layoutDoc._xPadding, this.props.xPadding),
                    paddingTop: NumCast(this.layoutDoc._yPadding, this.props.yPadding),
                    paddingBottom: NumCast(this.layoutDoc._yPadding, this.props.yPadding),
                }}
                onDoubleClick={action(e => {
                    this.toggleProperties();
                    this.presBoxView?.regularSelect(this.rootDoc, this._itemRef.current!, this._dragRef.current!, false);
                })}
                onPointerOver={this.onPointerOver}
                onPointerLeave={this.onPointerLeave}
                onPointerDown={this.headerDown}>
                {miniView ? (
                    <div className={`presItem-miniSlide ${isSelected ? 'active' : ''}`} ref={this._dragRef}>
                        {`${this.indexInPres + 1}.`}
                    </div>
                ) : (
                    <div
                        ref={this._dragRef}
                        className={`presItem-slide ${isCurrent ? 'active' : ''}`}
                        style={{
                            display: 'infline-block',
                            backgroundColor: this.props.styleProvider?.(this.layoutDoc, this.props, StyleProp.BackgroundColor),
                            //layout_boxShadow: presBoxColor && presBoxColor !== 'white' && presBoxColor !== 'transparent' ? (isCurrent ? '0 0 0px 1.5px' + presBoxColor : undefined) : undefined,
                            border: presBoxColor && presBoxColor !== 'white' && presBoxColor !== 'transparent' ? (isCurrent ? presBoxColor + ' solid 2.5px' : undefined) : undefined,
                        }}>
                        <div
                            className="presItem-name"
                            style={{
                                display: 'inline-flex',
                                pointerEvents: isSelected ? undefined : 'none',
                                width: `calc(100% ${this.rootDoc.presentation_expandInlineButton ? '- 50%' : ''} - ${this.presButtons.length * 22}px`,
                                cursor: isSelected ? 'text' : 'grab',
                            }}>
                            <div
                                className="presItem-number"
                                title="select without navigation"
                                onPointerDown={e => {
                                    e.stopPropagation();
                                    if (this._itemRef.current && this._dragRef.current) {
                                        this.presBoxView?.modifierSelect(activeItem, this._itemRef.current, this._dragRef.current, true, false, false);
                                    }
                                }}
                                onClick={e => e.stopPropagation()}>{`${this.indexInPres + 1}.  `}</div>
                            <EditableView ref={this._titleRef} oneLine={true} editing={!isSelected ? false : undefined} contents={activeItem.title} overflow={'ellipsis'} GetValue={() => StrCast(activeItem.title)} SetValue={this.onSetValue} />
                        </div>
                        {/* <Tooltip title={<><div className="dash-tooltip">{"Movement speed"}</div></>}><div className="presItem-time" style={{ display: showMore ? "block" : "none" }}>{this.transition}</div></Tooltip> */}
                        {/* <Tooltip title={<><div className="dash-tooltip">{"Duration"}</div></>}><div className="presItem-time" style={{ display: showMore ? "block" : "none" }}>{this.duration}</div></Tooltip> */}
                        <div className="presItem-slideButtons" style={{ position: 'absolute', right: 0 }}>
                            {...this.presButtons}
                        </div>
                        {this.renderEmbeddedInline}
                    </div>
                )}
            </div>
        );
    }

    render() {
        return !(this.rootDoc instanceof Doc) || this.targetDoc instanceof Promise ? null : this.mainItem;
    }
}
