/**
 * Controller for firmware
 *
 * @module app/configuration
 * @exports firmwareController
 * @name firmwareController
 * @version 0.1.0
 */

window.angular && (function (angular) {
    'use strict';

    angular
        .module('app.configuration')
        .controller('firmwareController', [
                '$scope',
                '$window',
                'APIUtils',
                'dataService',
                '$location',
                '$anchorScroll',
                function ($scope, $window, APIUtils, dataService, $location, $anchorScroll) {
                    $scope.dataService = dataService;

                    //Scroll to target anchor
                    $scope.gotoAnchor = function () {
                        $location.hash('upload');
                        $anchorScroll();
                    };

                    $scope.firmwares = [];
                    $scope.bmcActiveVersion = "";
                    $scope.hostActiveVersion = "";
                    $scope.display_error = false;
                    $scope.confirm_upload_image = false;
                    $scope.reboot_confirm = false;
                    $scope.preserve_settings_confirm = false;
                    $scope.delete_image_id = "";
                    $scope.activate_image_id = "";
                    $scope.file_empty = true;
                    $scope.uploading = false;

                    $scope.error = {
                        modal_title: "",
                        title: "",
                        desc: "",
                        type: "warning"
                    };

                    $scope.activateImage = function(imageId){
                        $scope.activate_image_id = imageId;
                        $scope.preserve_settings_confirm = true;
                    }

                    $scope.displayError = function(data){
                        $scope.error = data;
                        $scope.display_error = true;
                    }

                    $scope.preserveSettingsConfirmed = function(){
                        //show progress..callapi..hide..iferror..show error
                        $scope.preserve_settings_confirm = false;
                    }

                    $scope.confirmWarmReboot = function(){
                        $scope.reboot_confirm = false;
                    }

                    $scope.upload = function(){
                        if(!$scope.file_empty){
                            $scope.confirm_upload_image = true;
                        }
                    }
                    $scope.confirmUpload = function(){
                        $scope.uploading = true;
                        APIUtils.uploadImage($scope.file, function(response){
                            $scope.uploading = false; 
                            if(response.status == 'error'){
                                $scope.displayError({
                                    modal_title: response.data.description,
                                    title: response.data.description,
                                    desc: response.data.exception,
                                    type: 'Error'
                                });
                            }else{
                                $scope.loadFirmwares();
                            }
                        });
                        $scope.confirm_upload_image = false;
                    }

                    $scope.deleteImage = function(imageId){
                        $scope.delete_image_id = imageId;
                        $scope.confirm_delete = true;
                    }
                    $scope.confirmDeleteImage = function(imageId){
                        $scope.confirm_delete = false;
                    }

                    $scope.fileNameChanged = function(){
                        $scope.file_empty = false;
                    }

                    $scope.uploading = false;
                    $scope.filters = {
                        bmc: {
                            imageType: 'BMC'
                        },
                        host: {
                            imageType: 'Host'
                        }
                    };

                    $scope.loadFirmwares = function(){
                        APIUtils.getFirmwares(function(data, bmcActiveVersion, hostActiveVersion){
                           $scope.firmwares = data;
                           $scope.bmcActiveVersion = bmcActiveVersion;
                           $scope.hostActiveVersion = hostActiveVersion;
                        });
                    }

                    $scope.loadFirmwares();
                }
            ]
        );

})(angular);
