(function() {

    'use strict';

    angular
        .module('moon')
        .directive('moonPolicyEditBasic', moonPolicyEditBasic);

    moonPolicyEditBasic.$inject = [];

    function moonPolicyEditBasic() {

        return {
            templateUrl : 'html/policy/edit/policy-edit-basic.tpl.html',
            bindToController : true,
            controller : moonPolicyEditBasicController,
            controllerAs : 'edit',
            scope : {
                policy : '='
            },
            restrict : 'E',
            replace : true
        };
    }

    angular
        .module('moon')
        .controller('moonPolicyEditBasicController', moonPolicyEditBasicController);

    moonPolicyEditBasicController.$inject = ['$scope', 'policyService', 'formService', 'alertService', '$translate', 'utilService', 'modelService'];

    function moonPolicyEditBasicController($scope, policyService, formService, alertService, $translate, utilService, modelService){

        var edit = this;

        edit.editPolicy = editPolicy;
        edit.init = init;

        edit.form = {};
        edit.modelsLoading = true;


        activate();

        function activate(){

            edit.policy = $scope.edit.policy;

            edit.policyToEdit = angular.copy(edit.policy);

            console.log(edit.policyToEdit);

            resolveModels();

        }

        /*
         *
         */

        function resolveModels() {

            modelService.findAllWithCallBack(resolveModelsCallback);

        }

        function resolveModelsCallback(models) {

            edit.models = models;

            _.each(models, function(model){

                if(model.id === edit.policy.model_id){
                    edit.selectedModel = model;
                }

            });

            edit.modelsLoading = false;

        }


        function editPolicy(){

            if(formService.isInvalid(edit.form)) {

                formService.checkFieldsValidity(edit.form);

            }else{

                edit.loading = true;

                delete edit.policyToEdit.model;

                edit.policyToEdit.model_id = edit.selectedModel.id;

                policyService.update(edit.policyToEdit, updateSuccess, updateError);

            }

            function updateSuccess(data) {

                var updatedPolicy = utilService.transformOne(data, 'policies');

                $translate('moon.policy.edit.basic.success', { policyName: updatedPolicy.name }).then( function(translatedValue) {
                    alertService.alertSuccess(translatedValue);
                });

                edit.loading = false;

                $scope.$emit('event:policyUpdatedSuccess', updatedPolicy);

            }

            function updateError(reason) {

                $translate('moon.policy.edit.basic.error', { policyName: edit.policy.name }).then( function(translatedValue) {
                    alertService.alertError(translatedValue);
                });

                edit.loading = false;

            }
        }

        function init(){

            edit.policyToEdit = angular.copy(edit.policy);

        }
    }

})();