define([
    "jquery",
    "underscore",
    "constants",
    "classes/Provider",
    "core",
    "eventMgr",
    "providers/gplusProvider"
], function($, _, constants, Provider, core, eventMgr) {

    var mediaImporter = {};

    // Create a map with providerId: providerModule
    var providerMap = _.chain(arguments).map(function(argument) {
        return argument instanceof Provider && [
            argument.providerId,
            argument
        ];
    }).compact().object().value();

    eventMgr.addListener("onReady", function() {
        _.each(providerMap, function(provider) {
            // Import image action links (if any)
            $(".action-import-image-" + provider.providerId).click(function() {
                // Take the insertLinkCallback from core module
                var insertLinkCallback = core.insertLinkCallback;
                // Unset it to be sure core module will not call it
                core.insertLinkCallback = undefined;
                provider.importImage(function(error, imageLink) {
                    if(error) {
                        insertLinkCallback(null);
                        return;
                    }
                    insertLinkCallback(imageLink || null);
                });
            });
        });

        function handleImgImport(evt) {
            var files = (evt.dataTransfer || evt.target).files;
            var file = _.first(files);
            if(file.name.match(/.(jpe?g|png|gif)$/i)) {
                evt.stopPropagation();
                evt.preventDefault();
                var reader = new FileReader();
                reader.onload = (function(importedFile) {
                    return function(e) {
                        var content = new Uint8Array(e.target.result);
                        providerMap.gplus.uploadImage(importedFile.name, content, function(error, imageLink) {
                            if(error) {
                                return;
                            }
                            // Generate an insertLinkCallback by clicking the
                            // pagedown button but without showing the dialog
                            core.catchModal = true;
                            $("#wmd-image-button").click();
                            core.catchModal = false;
                            // Take the insertLinkCallback from core module
                            var insertLinkCallback = core.insertLinkCallback;
                            // Unset it to be sure core module will not call it
                            core.insertLinkCallback = undefined;
                            insertLinkCallback(imageLink || null);
                        });
                    };
                })(file);
                var blob = file.slice(0, constants.IMPORT_IMG_MAX_CONTENT_SIZE);
                reader.readAsArrayBuffer(blob);
            }
        }

        function handleDragOver(evt) {
            evt.stopPropagation();
            evt.preventDefault();
            evt.dataTransfer.dropEffect = 'copy';
        }

        $('#wmd-input').each(function() {
            this.addEventListener('dragover', handleDragOver, false);
            this.addEventListener('drop', handleImgImport, false);
        });

    });

    return mediaImporter;
});