var RenderedTarget = require('./rendered-target');
var Blocks = require('../engine/blocks');

/**
 * Sprite to be used on the Scratch stage.
 * All clones of a sprite have shared blocks, shared costumes, shared variables.
 * @param {?Blocks} blocks Shared blocks object for all clones of sprite.
 * @param {Runtime} runtime Reference to the runtime.
 * @constructor
 */
var Sprite = function (blocks, runtime) {
    this.runtime = runtime;
    if (!blocks) {
        // Shared set of blocks for all clones.
        blocks = new Blocks();
    }
    this.blocks = blocks;
    /**
     * Human-readable name for this sprite (and all clones).
     * @type {string}
     */
    this.name = '';
    /**
     * List of costumes for this sprite.
     * Each entry is an object, e.g.,
     * {
     *      skinId: 1,
     *      name: "Costume Name",
     *      bitmapResolution: 2,
     *      rotationCenterX: 0,
     *      rotationCenterY: 0
     * }
     * @type {Array.<!Object>}
     */
    this.costumes = [];
    /**
     * List of sounds for this sprite.
    */
    this.sounds = [];
    /**
     * List of clones for this sprite, including the original.
     * @type {Array.<!RenderedTarget>}
     */
    this.clones = [];
};

/**
 * Create a clone of this sprite.
 * @returns {!RenderedTarget} Newly created clone.
 */
Sprite.prototype.createClone = function () {
    var newClone = new RenderedTarget(this, this.runtime);
    newClone.isOriginal = this.clones.length === 0;
    this.clones.push(newClone);
    if (newClone.isOriginal) {
        newClone.initDrawable();
    }
    return newClone;
};

module.exports = Sprite;