import bindAll from 'lodash.bindall';
import PropTypes from 'prop-types';
import React from 'react';
import {connect} from 'react-redux';

/**
 * Turbo Mode component passes toggleTurboMode function to its child.
 * It also includes `turboMode` in the props passed to the children.
 * It expects this child to be a function with the signature
 *     function (toggleTurboMode, {turboMode, ...props}) {}
 * The component can then be used to attach turbo mode setting functionality
 * to any other component:
 *
 * <TurboMode>{(toggleTurboMode, props) => (
 *     <MyCoolComponent
 *         turboEnabled={props.turboMode}
 *         onClick={toggleTurboMode}
 *         {...props}
 *     />
 * )}</TurboMode>
 */
class TurboMode extends React.Component {
    constructor (props) {
        super(props);
        bindAll(this, [
            'toggleTurboMode'
        ]);
    }
    toggleTurboMode () {
        this.props.vm.setTurboMode(!this.props.turboMode);
    }
    render () {
        const {
            /* eslint-disable no-unused-vars */
            children,
            vm,
            /* eslint-enable no-unused-vars */
            ...props
        } = this.props;
        return this.props.children(this.toggleTurboMode, props);
    }
}

TurboMode.propTypes = {
    children: PropTypes.func,
    turboMode: PropTypes.bool,
    vm: PropTypes.shape({
        setTurboMode: PropTypes.func
    })
};

const mapStateToProps = state => ({
    vm: state.scratchGui.vm,
    turboMode: state.scratchGui.vmStatus.turbo
});

export default connect(
    mapStateToProps,
    () => ({}) // omit dispatch prop
)(TurboMode);