const React = require('react');

const MediaLibrary = require('../../lib/media-library');
const VM = require('scratch-vm');

const BackdropLibrary = require('../../containers/backdrop-library.jsx');
const CostumeLibrary = require('../../containers/costume-library.jsx');
const SpriteLibrary = require('../../containers/sprite-library.jsx');
const SpriteSelectorComponent = require('../sprite-selector/sprite-selector.jsx');
const StageSelector = require('../../containers/stage-selector.jsx');

const styles = require('./target-pane.css');

/*
 * Pane that contains the sprite selector, sprite info, stage selector,
 * and the new sprite, costume and backdrop buttons
 * @param {object} props Props for the component
 * @returns {React.Component} rendered component
 */
const TargetPane = function (props) {
    const {
        editingTarget,
        mediaLibrary,
        backdropLibraryVisible,
        costumeLibraryVisible,
        spriteLibraryVisible,
        onNewSpriteClick,
        onNewCostumeClick,
        onNewBackdropClick,
        onRequestCloseBackdropLibrary,
        onRequestCloseCostumeLibrary,
        onRequestCloseSpriteLibrary,
        onSelectSprite,
        stage,
        sprites,
        vm,
        ...componentProps
    } = props;
    return (
        <div
            className={styles.targetPane}
            {...componentProps}
        >
            <SpriteSelectorComponent
                selectedId={editingTarget}
                sprites={sprites}
                onSelectSprite={onSelectSprite}
            />
            <StageSelector
                backdropCount={stage.costumeCount}
                id={stage.id}
                selected={stage.id === editingTarget}
                url={stage.costume.skin}
                onSelect={onSelectSprite}
            />
            <p className={styles.targetPaneLibraryButtons}>
                <button onClick={onNewSpriteClick}>New Sprite</button>
                {editingTarget === stage.id ? (
                    <button onClick={onNewBackdropClick}>New Backdrop</button>
                ) : (
                    <button onClick={onNewCostumeClick}>New Costume</button>
                )}
                <SpriteLibrary
                    mediaLibrary={mediaLibrary}
                    visible={spriteLibraryVisible}
                    vm={vm}
                    onRequestClose={onRequestCloseSpriteLibrary}
                />
                <CostumeLibrary
                    mediaLibrary={mediaLibrary}
                    visible={costumeLibraryVisible}
                    vm={vm}
                    onRequestClose={onRequestCloseCostumeLibrary}
                />
                <BackdropLibrary
                    mediaLibrary={mediaLibrary}
                    visible={backdropLibraryVisible}
                    vm={vm}
                    onRequestClose={onRequestCloseBackdropLibrary}
                />
            </p>
        </div>
    );
};
const spriteShape = React.PropTypes.shape({
    costume: React.PropTypes.shape({
        skin: React.PropTypes.string,
        name: React.PropTypes.string,
        bitmapResolution: React.PropTypes.number,
        rotationCenterX: React.PropTypes.number,
        rotationCenterY: React.PropTypes.number
    }),
    id: React.PropTypes.string,
    name: React.PropTypes.string,
    order: React.PropTypes.number
});

TargetPane.propTypes = {
    backdropLibraryVisible: React.PropTypes.bool,
    costumeLibraryVisible: React.PropTypes.bool,
    editingTarget: React.PropTypes.string,
    mediaLibrary: React.PropTypes.instanceOf(MediaLibrary),
    onNewBackdropClick: React.PropTypes.func,
    onNewCostumeClick: React.PropTypes.func,
    onNewSpriteClick: React.PropTypes.func,
    onRequestCloseBackdropLibrary: React.PropTypes.func,
    onRequestCloseCostumeLibrary: React.PropTypes.func,
    onRequestCloseSpriteLibrary: React.PropTypes.func,
    onSelectSprite: React.PropTypes.func,
    spriteLibraryVisible: React.PropTypes.bool,
    sprites: React.PropTypes.objectOf(spriteShape),
    stage: spriteShape,
    vm: React.PropTypes.instanceOf(VM)
};

TargetPane.defaultProps = {
    mediaLibrary: new MediaLibrary()
};

module.exports = TargetPane;