logman.factory('$bucket',['$resource',function($resource){

var Bucket = $resource('/api/buckets/:id',{id: '@id'},{
        save: {method: 'PUT'},
        create: {method: 'POST'},
        generateToken: {method: 'PUT', params:{generateToken:true}}
}); 

var collection = Bucket.query();

return {
        Bucket: Bucket,
        collection: collection,
        reload: function(){
                Bucket.query({},function(ls){
                        collection.length = 0;
                        for (var i=0; i < ls.length; i++)collection.push(ls[i]); 
                });
        }
}

}]);

var BucketListCtl = function($scope, $bucket, $location){

$scope.buckets = $bucket.collection;
$scope.is_admin = user.admin;

$scope.toLogs = function(b){
        $location.path('/buckets/'+b.id+'/logs');
}

$scope.toDetails = function(b){
        $location.path('/buckets/'+b.id+'/details');
}

}

var BucketAddEditCtl = function($scope, $bucket, $routeParams, $user,$location){

$scope.users = $user.collection;

if($routeParams.id)$scope.bucket= $bucket.Bucket.get({id: $routeParams.id})
else $scope.bucket = new $bucket.Bucket({user_ids:[]});

$scope.haveAccess = function(user){
        if(!$scope.bucket.user_ids)return;
        for (var i=0; i < $scope.bucket.user_ids.length; i++)
          if($scope.bucket.user_ids[i]==user.id)return true;

        return false;
}       

$scope.invertAccess = function(user){
        if(!$scope.bucket.user_ids)return;
        var have = $scope.haveAccess(user);

        if(!have) $scope.bucket.user_ids.push(user.id);
        else $scope.bucket.user_ids.splice($scope.bucket.user_ids.indexOf(user.id),1);
}

$scope.saveCreate = function(){
        function success(){
                $bucket.reload();
        }

        if($scope.bucket.id)$scope.bucket.$save(success);
        else $scope.bucket.$create(success);    
}

$scope.generateToken = function(){
        message = "Warning!!!\n\nGenerating new token will cause all apps that use old token to stop! Continue?";
        if(confirm(message)){
                $scope.bucket.$generateToken($bucket.reload);
        }
}

$scope.destroyBucket = function(){
        if(confirm('Are you sure?')){
                $scope.bucket.$delete(function(){
                        $bucket.reload();
                        $location.path('/');
                });
        }
}

}

var LogsCtl = function($scope, $resource, $routeParams,$bucket,$modal){

$scope.bucket = $bucket.Bucket.get({id: $routeParams.id});
$scope.criterias = [{}]

$scope.removeCriteria = function(c){
        var i = $scope.criterias.indexOf(c);
        if(i>-1) $scope.criterias.splice(i,1);
}

$scope.loadLogs = function(page){
        if(page)$scope.active_page = page;
        else page = $scope.active_page;

        var queryData = JSON.stringify($scope.criterias)
        queryData = encodeURIComponent(queryData);

        $scope.logs = $resource('/api/buckets/:bucket_id/logs').get({
                bucket_id: $routeParams.id, 
                page: page, 
                query:queryData
        });     
}

$scope.show = function(log){
        $scope.active = log;
        var modalInstance = $modal.open({
      templateUrl: '/app/bucket/log-details.html',
      controller: LogDetails,
      resolve: {log: function(){return log; }},
      windowClass: 'full-modal'
    });
}

$scope.loadLogs(1);

}

var LogDetails = function($scope, $modalInstance,log){

$scope.log = log;

$scope.cancel = function () {
   $modalInstance.dismiss('cancel');
};

$scope.log_type = function(log,for_class_name){
       if(!for_class_name) return ['Error','Success','Warning', 'Info'][log.log_type-1]
       else{
               var klass = $scope.log_type(log).toLocaleLowerCase();
               if(klass=='error')klass='danger';
               return klass;
       } 
}

$scope.formatData = function(root){
       return JSON.stringify(root);
}

}

logman.directive('jsonTree',function(){

function link(scope, element){
        $(element).jsontree(scope.json_data);
}

return {
        link: link,
        scope: {json_data:'=jsonData'}
}

});