/*****************************************************************************
 * Open MCT, Copyright (c) 2014-2018, United States Government
 * as represented by the Administrator of the National Aeronautics and Space
 * Administration. All rights reserved.
 *
 * Open MCT is licensed under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * http://www.apache.org/licenses/LICENSE-2.0.
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations
 * under the License.
 *
 * Open MCT includes source code licensed under additional open source
 * licenses. See the Open Source Licenses file (LICENSES.md) included with
 * this source code distribution or the Licensing information page available
 * at runtime from the About dialog for additional information.
 *****************************************************************************/

define(["zepto"], function ($) {

    /**
     * The FileInputService provides an interface for triggering a file input.
     *
     * @constructor
     * @memberof platform/forms
     */
    function FileInputService() {

    }

    /**
     * Creates, triggers, and destroys a file picker element and returns a
     * promise for an object containing the chosen file's name and contents.
     *
     * @returns {Promise} promise for an object containing file meta-data
     */
    FileInputService.prototype.getInput = function () {
        var input = this.newInput();
        var read = this.readFile;
        var fileInfo = {};
        var file;

        return new Promise(function (resolve, reject) {
            input.trigger("click");
            input.on('change', function (event) {
                file = this.files[0];
                input.remove();
                if (file) {
                    read(file)
                        .then(function (contents) {
                            fileInfo.name = file.name;
                            fileInfo.body = contents;
                            resolve(fileInfo);
                        }, function () {
                            reject("File read error");
                        });
                }
            });
        });
    };

    FileInputService.prototype.readFile = function (file) {
        var fileReader = new FileReader();

        return new Promise(function (resolve, reject) {
            fileReader.onload = function (event) {
                resolve(event.target.result);
            };

            fileReader.onerror = function () {
                return reject(event.target.result);
            };
            fileReader.readAsText(file);
        });
    };

    FileInputService.prototype.newInput  = function () {
        var input = $(document.createElement('input'));
        input.attr("type", "file");
        input.css("display", "none");
        $('body').append(input);
        return input;
    };

    return FileInputService;
});
