/*jslint vars: true, plusplus: true, devel: true, nomen: true, regexp: true, indent: 4, maxerr: 50 */
/*global $, alertData, successData, bodymovin, mainController, compRenderController, messageController */
var snapshotController = (function () {
    'use strict';
    var ob = {}, view, csInterface, anim, header, controls, current, animContainer, slider, thumb, snapshotButton, $window, showing = false;
    var totalFrames, currentFrame, sliderWidth, rendersSelection, listContainer;
    
    function showSelection() {
        mainController.showView('selection');
    }
    
    function showControls() {
        controls.find('.snapshotButton').show();
        controls.find('.frames .total').show();
        current.show();
    }
    
    function hideControls() {
        controls.find('.snapshotButton').hide();
        controls.find('.frames .total').hide();
        current.hide();
    }
    
    function browseFiles() {
        var eScript = 'bm_main.browseFile()';
        csInterface.evalScript(eScript);
    }
    
    function updateControls(origin) {
        if (origin !== 'input') {
            controls.find('.frames .current').html(currentFrame);
        }
        if (anim) {
            anim.goToAndStop(currentFrame + 1, true);
        }
        var x = (currentFrame / totalFrames) * sliderWidth;
        thumb.css('left', x - 5 + 'px');
    }
    
    function loadAnimation(data) {
        var jsonData = JSON.parse(data);
        totalFrames = jsonData.animation.totalFrames;
        controls.find('.frames .total .value').html(totalFrames);
        currentFrame = 1;
        if (anim) {
            anim.destroy();
        }
        updateControls();
        var params = {
                animType: 'svg',
                wrapper: animContainer[0],
                loop: false,
                autoplay: false,
                prerender: true,
                animationData: jsonData
            };
        anim = bodymovin.loadAnimation(params);
        showControls();
    }
    
    function addSelectionListener(elem, data) {
        elem.on('click', function () {
            rendersSelection.hide();
            loadAnimation(data.renderData);
        });
    }
    
    function displayCurrentRenders() {
        var compositions = compRenderController.getCompositions();
        if (!compositions || compositions.length === 0) {
            messageController.showMessage({type: 'alert', message: 'You have no recent renders.\n Try browsing your files'});
        } else if (compositions.length === 1) {
            loadAnimation(compositions[0].renderData);
        } else {
            rendersSelection.show();
            listContainer.empty();
            var i, len = compositions.length;
            var li;
            for (i = 0; i < len; i += 1) {
                li = $('<button class="generalButton">');
                li.html(compositions[i].name);
                listContainer.append(li);
                addSelectionListener(li, compositions[i]);
            }
        }
    }
    
    function handleFilePath(ev) {
        loadAnimation(ev.data.substr(7));
    }
    
    function handleWindowResize() {
        if (!showing) {
            return;
        }
        animContainer.css('height', $window.height() - 2 - header.outerHeight() - controls.outerHeight() + 'px');
        sliderWidth = slider.width();
        
    }
    
    function frameChangeHandler() {
        var num = parseInt(current.html(), 10);
        if (isNaN(num)) {
            return;
        }
        if (num < 0) {
            num = 0;
        } else if (num >= totalFrames) {
            num = totalFrames - 1;
        }
        currentFrame = num;
        updateControls('input');
    }
    
    function updateSliderValue(pageX) {
        var x = pageX - slider.offset().left;
        var perc = x / sliderWidth;
        if (perc < 0) {
            perc = 0;
        } else if (perc > 1) {
            perc = 1;
        }
        currentFrame = Math.round(perc * totalFrames);
        updateControls();
    }
    
    function sliderMove(ev) {
        updateSliderValue(ev.pageX);
    }
        
    function sliderUp(ev) {
        $window.off('mousemove', sliderMove);
        $window.off('mouseup', sliderUp);
    }
        
    function sliderDown(ev) {
        $window.on('mouseup', sliderUp);
        $window.on('mousemove', sliderMove);
        updateSliderValue(ev.pageX);
    }
    
    function addSliderListeners() {
        
        slider = controls.find('.slider');
        thumb = controls.find('.thumb');
        slider.on('mousedown', sliderDown);
    }
    
    function saveSnapshot() {
        var svgData = animContainer[0].innerHTML;
        var result = window.cep.fs.showSaveDialogEx('Select location', '', ['*.svg'], 'snapshot.svg');
        var targetFilePath = result.data;
        var writeResult = window.cep.fs.writeFile(targetFilePath, svgData);
        if (0 !== writeResult.err) {
            console.log('faillled');
        }
    }
    
    function init(csIntfc) {
        csInterface = csIntfc;
        view = $('#snapshot');
        view.hide();
        view.find('.buttons .current').on('click', displayCurrentRenders);
        view.find('.buttons .browse').on('click', browseFiles);
        view.find('.return').on('click', showSelection);
        animContainer = view.find('.animContainer');
        controls = view.find('.controls');
        controls.find('.snapshotButton').on('click', saveSnapshot);
        current = controls.find('.frames .current');
        current.on('input', frameChangeHandler);
        header = view.find('.header');
        rendersSelection = view.find('.rendersSelection');
        listContainer = rendersSelection.find('.listContainer');
        rendersSelection.hide();
        $window = $(window);
        csInterface.addEventListener('bm:file:path', handleFilePath);
        $(window).on('resize', handleWindowResize);
        addSliderListeners();
        hideControls();
    }
    
    function show() {
        if (!showing) {
            showing = true;
            view.show();
            handleWindowResize();
        }
    }
    
    function hide() {
        if (showing) {
            showing = false;
            view.hide();
            slider.off('mouseup', sliderUp);
            slider.off('mousemove', sliderMove);
        }
    }
    
    ob.show = show;
    ob.hide = hide;
    ob.init = init;
    return ob;
}());