/* global define */
"use strict";

define(['jquery', 'underscore', 'backbone', 'x2js', 'models/formats/ObjectFormat'],
    function($, _, Backbone, X2JS, ObjectFormat) {

    /**
     * @class ObjectFormats
     * @classdesc ObjectFormats represents the DataONE object format list
     * found at https://cn.dataone.org/cn/v2/formats, or
     * the Coordinating Node environment configured `AppModel.d1CNBaseUrl`
     * This collection is intended to be used as a formats cache -
     * retrieved once, and only refreshed later if an object format
     * isn't present when needed.
     * @classcategory Collections
     * @extends Backbone.Collection
     * @constructor
     */
    var ObjectFormats = Backbone.Collection.extend(
      /** @lends ObjectFormats.prototype */{

        model: ObjectFormat,

        /**
         * The constructed URL of the collection
         * (/cn/v2/formats)
         * @returns {string} - The URL to use during fetch
         */
        url: function() {

            // no need for authentication token, just the URL
            return MetacatUI.appModel.get("formatsServiceUrl");

        },

        /**
        * Retrieve the formats from the Coordinating Node
        * @extends Backbone.Collection#fetch
        */
        fetch: function(options) {
            var fetchOptions = _.extend({dataType: "text"}, options);

            return Backbone.Model.prototype.fetch.call(this, fetchOptions);

        },

        /**
        * Parse the XML response from the CN
        */
        parse: function(response) {

            // If the collection is already parsed, just return it
            if ( typeof response === "object" ) return response;

            // Otherwise, parse it
            var x2js = new X2JS();
            var formats = x2js.xml_str2json(response);

            return formats.objectFormatList.objectFormat;
        }

    });

    return ObjectFormats;
});
