(function () {
  var ns = $.namespace('pskl.utils');

  ns.PiskelFileUtils = {
    /**
     * Load a piskel from a piskel file.
     * After deserialization is successful, the provided success callback will be called.
     * Success callback is expected to handle 3 arguments : (piskel:Piskel, descriptor:PiskelDescriptor, fps:Number)
     * @param  {File} file the .piskel file to load
     * @param  {Function} onSuccess Called if the deserialization of the piskel is successful
     * @param  {Function} onError NOT USED YET
     */
    loadFromFile : function (file, onSuccess, onError) {
      pskl.utils.FileUtils.readFile(file, function (content) {
        var rawPiskel = pskl.utils.Base64.toText(content);
        ns.PiskelFileUtils.decodePiskelFile(
          rawPiskel,
          function (piskel, descriptor, fps) {
            // if using Node-Webkit, store the savePath on load
            // Note: the 'path' property is unique to Node-Webkit, and holds the full path
            if (pskl.utils.Environment.detectNodeWebkit()) {
              piskel.savePath = file.path;
            }
            onSuccess(piskel, descriptor, fps);
          },
          onError
        );
      });
    },

    decodePiskelFile : function (rawPiskel, onSuccess, onError) {
      var serializedPiskel = JSON.parse(rawPiskel);
      var fps = serializedPiskel.piskel.fps;
      var piskel = serializedPiskel.piskel;
      var descriptor = new pskl.model.piskel.Descriptor(piskel.name, piskel.description, true);
      pskl.utils.serialization.Deserializer.deserialize(serializedPiskel, function (piskel) {
        onSuccess(piskel, descriptor, fps);
      });
    }

  };
})();
