/**
 * Style represents in a generic way a style applied to canvas drawing.
 *
 * Some styles (e.g. gradients, patterns) required a context to be generated this provides a generic way to share styles between objects.
 *
 * @class
 */
function Style()
{
    /**
     * Cached style object pre-generated from previous calls. To avoid regenerating the same style object every cycle.
     *
     * Inherited classes should write their own get method that returns the style object and stores it in this property.
     * 
     * @type {string | CanvasGradient | CanvasPattern}
     */
    this.cache = null;

    /**
     * Indicates if the style object needs to be updated, should be used after applying changed to the style in order to generate a new object.
     *
     * Inherited classes should implement this functionality.
     * 
     * @type {boolean}
     */
    this.needsUpdate = true;
}

/**
 * Get generated style object from style data and the drawing context.
 *
 * @param {CanvasRenderingContext2D} context Context being used to draw the object.
 * @return {string | CanvasGradient | CanvasPattern} Return the canvas style object generated.
 */
Style.prototype.get = function(context) {};

/**
 * Serialize the style to JSON object, called by the objects using these styles.
 *
 * @return {Object} Serialized style data.
 */
Style.prototype.serialize = function() {};

/**
 * Parse the style attributes from JSON object data created with the serialize() method.
 *
 * @param {Object} data Serialized style data.
 */
Style.prototype.parse = function(data) {};

/**
 * List of available style types known by the application. Stores the object constructor by object type.
 *
 * @static
 * @type {Map<string, Function>}
 */
Style.types = new Map([]);

/**
 * Register a style type to be serializable. Associates the type string to the object constructor.
 *
 * @param {Function} constructor Style constructor.
 * @param {string} type Style type name.
 */
Style.register = function(constructor, type)
{
    Style.types.set(type, constructor);
};

/**
 * Parse style from JSON serialized data, created a style of the correct data type automatically and parses its data.
 *
 * @param data JSON serialized data.
 * @returns {Style} Parsed style from the provided data.
 */
Style.parse = function (data)
{
    var style = new (Style.types.get(data.type))();
    style.parse(data);
    return style;
};

export {Style};
