import React, {useState, useEffect} from 'react';
import PropTypes from 'prop-types';
import svgPanZoom from 'svg-pan-zoom';
import {useViewport} from '@airtable/blocks/ui';

export const SvgPanZoomContext = React.createContext(null);

/**
 * Wraps children in a context provider for the `svgPanZoom` instance.
 *
 * The `svgPanZoom` instance can't be instantiated until after the first render, because it needs
 * the root SVG element to exist in the DOM.
 *
 * @param {Element} props.children
 */
export default function SvgPanZoomWrapper({children}) {
    const [svgPanZoomInstance, setSvgPanZoomInstance] = useState(null);
    const viewport = useViewport();
    useEffect(() => {
        if (svgPanZoomInstance) {
            svgPanZoomInstance.resize();
            svgPanZoomInstance.fit();
            svgPanZoomInstance.center();
        }
    }, [svgPanZoomInstance, viewport.isFullscreen]);

    useEffect(() => {
        const panZoom = svgPanZoom('#root', {
            zoomScaleSensitivity: 0.04,
            minZoom: 0.2,
            maxZoom: 40,
            center: true,
            fit: true,
            dblClickZoomEnabled: false,
        });
        setSvgPanZoomInstance(panZoom);

        return () => panZoom.destroy();
    }, []);

    return (
        <SvgPanZoomContext.Provider value={svgPanZoomInstance}>
            {children}
        </SvgPanZoomContext.Provider>
    );
}

SvgPanZoomContext.propTypes = {
    children: PropTypes.node,
};