/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
(function () {
  'use strict';

  var falconModule = angular.module('app.services.falcon', ['app.services.x2js', 'ngCookies']);

  falconModule.factory('Falcon', ["$http", "X2jsService", "$location", '$rootScope', '$cookieStore', '$timeout',
    function ($http, X2jsService, $location, $rootScope, $cookieStore, $timeout) {

      var Falcon = {},
        NUMBER_OF_ENTITIES = 20,
        NUMBER_OF_INSTANCES = 11; // 10 + 1 for next page

      function buildURI(uri, noUser) {
        if ($rootScope.ambariView()) {
          uri = uri.substring(2);
          uri = $rootScope.serviceURI + uri;
        }
        if(!$rootScope.secureMode && !noUser){
          uri = add_user(uri);
        }
        console.log(uri);
        return uri;
      }

      function add_user(uri) {
        var userToken = $cookieStore.get('userToken');
        var paramSeparator = (uri.indexOf('?') !== -1) ? '&' : '?';
        uri = uri + paramSeparator + 'user.name=' + userToken.user;
        return uri;
      }

      //response Order
      Falcon.orderBy = {
        enable: false,
        name: "asc"
      };

      //-------------Server RESPONSE----------------------//
      Falcon.responses = {
        display: true,
        queue: [],
        count: {pending: 0, success: 0, error: 0},
        multiRequest: {cluster: 0, feed: 0, process: 0},
        listLoaded: {cluster: false, feed: false, process: false}
      };

      Falcon.logRequest = function () {
        Falcon.responses.count.pending = Falcon.responses.count.pending + 1;
      };

      Falcon.responses.showAll = false;
      Falcon.responses.isVisible = false;

      Falcon.hide = function () {
        $rootScope.$emit('hideNotifications', {'delay' : 'slow'});
      };

      Falcon.responses.unreaded = 0;
      Falcon.notify = function (showAll) {
        if (showAll) {
          Falcon.responses.unreaded = 0;
          if (Falcon.responses.isVisible) {
            Falcon.responses.isVisible = false;
            $rootScope.$emit('hideNotifications');
          } else {
            Falcon.responses.isVisible = true;
            $rootScope.$emit('showNotifications');
          }
          Falcon.responses.showAll = true;
        } else {
          Falcon.responses.unreaded++;
          Falcon.responses.isVisible = false;
          $rootScope.$emit('flashNotifications');
          Falcon.hide();
          Falcon.responses.showAll = false;
        }
      };

      Falcon.hideNotifs = function () {
        $rootScope.$emit('hideNotifications');
        Falcon.responses.isVisible = false;
        Falcon.responses.queue.forEach(function(notifMsg) {
          notifMsg.readed = true;
        });
      };

      Falcon.logResponse = function (type, messageObject, entityType, hide) {
        if (type === 'success') {
          if (!hide) {
            var response = {
              success: true,
              type: "success",
              status: messageObject.status,
              message: messageObject.message,
              requestId: messageObject.requestId,
              readed: false
            };
            Falcon.responses.queue.push(response);
            Falcon.responses.count.success = Falcon.responses.count.success + 1;
            Falcon.notify(false);
          }
          Falcon.responses.count.pending = Falcon.responses.count.pending - 1;
        }
        if (type === 'cancel') {
          if (!hide) {
            var response = {
              success: true,
              type: "cancel",
              status: messageObject.state,
              state: messageObject.state,
              message: messageObject.message,
              model: messageObject.model,
              readed: false
            };
            Falcon.responses.queue.push(response);
            Falcon.notify(false);
            return;
          }
        }
        if (type === 'error') {
          if (messageObject.status !== undefined) {
            var response = {
              success: false,
              type: "error",
              status: messageObject.status,
              message: messageObject.message,
              requestId: messageObject.requestId,
              readed: false
            };
          } else if (messageObject.errorCode !== undefined) {
            var response = {
              success: false,
              type: "error",
              status: "error",
              message: messageObject.errorMessage,
              requestId: messageObject.requestId,
              readed: false
            };
          } else {
            if (messageObject.slice(0, 6) !== "Cannot") {
              var errorMessage = X2jsService.xml_str2json(messageObject);
              var response = {
                success: false,
                type: "error",
                status: errorMessage.result ? errorMessage.result.status : 'error',
                message: errorMessage.result ? errorMessage.result.message : 'Unexpected Error',
                requestId: errorMessage.result ? errorMessage.result.requestId : 0,
                readed: false
              };
            }
            else {
              var response = {
                success: false,
                type: "error",
                status: "No connection",
                message: messageObject,
                requestId: "no ID",
                readed: false
              };
            }
          }
          if (hide) {
            Falcon.responses.count.pending = Falcon.responses.count.pending - 1;
            return; //>> just takes out the pending request and returns from the func
          }
          Falcon.responses.queue.push(response);
          Falcon.responses.count.error = Falcon.responses.count.error + 1;
          Falcon.responses.count.pending = Falcon.responses.count.pending - 1;
          Falcon.notify(false);
        }
        if (type === 'warning') {
          if (!hide) {
            var response = {
              success: true,
              type: "warning",
              status: messageObject.status,
              message: messageObject.message,
              model: '',
              readed: false
            };
            Falcon.responses.queue.push(response);
            Falcon.notify(false);
            return;
          }
        }
        if (entityType && entityType !== false) {
          entityType = entityType.toLowerCase();
          Falcon.responses.multiRequest[entityType] = Falcon.responses.multiRequest[entityType] - 1;
        }

      };
      Falcon.removeMessage = function (index) {
        if (index === -1) {
          index = Falcon.responses.queue.length - 1;
        }
        if (Falcon.responses.queue[index].success) {
          Falcon.responses.count.success = Falcon.responses.count.success - 1;
        }
        else {
          Falcon.responses.count.error = Falcon.responses.count.error - 1;
        }
        Falcon.responses.queue.splice(index, 1);
      };


      Falcon.errorMessage = function (message) {
        var response = {
          type: "error",
          message: message,
          readed: false
        };
        Falcon.responses.queue.push(response);
        Falcon.notify(false);
      };
      Falcon.warningMessage = function (message) {
        var response = {
          type: "warning",
          message: message,
          readed: false
        };
        Falcon.responses.queue.push(response);
        Falcon.notify(false);
      };

      //-------------METHODS-----------------------------//

      Falcon.getServerConfig = function () {
        return $http.get(buildURI('../api/admin/version?user.name=falcon', true));
      };

      Falcon.getServerStack = function () {
        return $http.get(buildURI('../api/admin/stack'));
      };

      Falcon.clearUser = function () {
        return $http.get(buildURI('../api/admin/clearuser?user.name=falcon', true));
      };

      Falcon.getCurrentUser = function () {
        return $http.get(buildURI('../api/admin/getuser', true));
      };

      Falcon.getRuntimeConfig = function (currentUser) {
        return $http.get(buildURI('../api/admin/config/runtime?user.name=' + currentUser, true));
      };

      Falcon.postValidateEntity = function (xml, type) {
        return $http.post(buildURI('../api/entities/validate/' + type), xml, {headers: {'Content-Type': 'text/plain'}});
      };
      Falcon.postSubmitEntity = function (xml, type) {
        return $http.post(buildURI('../api/entities/submit/' + type), xml, {headers: {'Content-Type': 'text/plain'}});
      };
      Falcon.postUpdateEntity = function (xml, type, name) {
        return $http.post(buildURI('../api/entities/update/' + type + '/' + name), xml, {headers: {'Content-Type': 'text/plain'}});
      };

      Falcon.postScheduleEntity = function (type, name) {
        return $http.post(buildURI('../api/entities/schedule/' + type + '/' + name));
      };
      Falcon.postSuspendEntity = function (type, name) {
        return $http.post(buildURI('../api/entities/suspend/' + type + '/' + name));
      };
      Falcon.postResumeEntity = function (type, name) {
        return $http.post(buildURI('../api/entities/resume/' + type + '/' + name));
      };

      Falcon.deleteEntity = function (type, name) {
        return $http.delete(buildURI('../api/entities/delete/' + type + '/' + name));
      };

      Falcon.getEntities = function (type) {
        return $http.get(buildURI('../api/entities/list/' + type + '?fields=status,tags&numResults=' + NUMBER_OF_ENTITIES));
      };

      Falcon.getEntityDefinition = function (type, name) {
        return $http.get(buildURI('../api/entities/definition/' + type + '/' + name), {headers: {'Accept': 'text/plain'}});
      };

      Falcon.getEntityStatus = function (type, name) {
        return $http.get(buildURI('../api/entities/status/' + type + '/' + name));
      };

      Falcon.searchEntities = function (name, tags, entityType, offset, order) {
        var searchUrl = "../api/entities/list/";
        if (entityType !== undefined && entityType !== "") {
          if (entityType === "mirror") {
            if (tags === undefined || tags === "") {
              tags = "_falcon_mirroring_type";
            } else {
              tags += ",_falcon_mirroring_type";
            }
            searchUrl += "process";
          } else {
            searchUrl += entityType;
          }
        } else {
          //searchUrl += "all";
          //searchUrl += "schedulable";
          searchUrl += "feed,process";
        }
        searchUrl += "?fields=clusters,tags,status";
        if (name !== undefined && name !== "") {
          if (name !== "*") {
            searchUrl += "&nameseq=" + name;
          }
        }
        if (tags !== undefined && tags !== "") {
          searchUrl += "&tagkeys=" + tags;
        }
        if (offset !== undefined && offset !== "") {
          searchUrl += '&offset=' + offset + '&numResults=' + NUMBER_OF_ENTITIES;
        }
        if (Falcon.orderBy.enable) {
          searchUrl += '&orderBy=name&sortOrder=' + Falcon.orderBy.name;
        }
        return $http.get(buildURI(searchUrl));
      };

      Falcon.searchInstances = function (type, name, offset, start, end, status, orderBy, sortOrder) {
        //var searchUrl = "../api/instance/running/" + type + "/" + name + "?colo=*";
        //var searchUrl = "../api/instance/list/" + type + "/" + name + "?colo=*";
        var searchUrl = "../api/instance/logs/" + type + "/" + name + "?colo=*";
        if (start !== undefined && start !== "") {
          searchUrl += "&start=" + start;
        }
        if (end !== undefined && end !== "") {
          searchUrl += "&end=" + end;
        }
        if (status !== undefined && status !== "") {
          searchUrl += "&filterBy=STATUS:" + status;
        }
        if (orderBy !== undefined && orderBy !== "") {
          searchUrl += "&orderBy=" + orderBy;
        } else {
          searchUrl += "&orderBy=startTime";
        }
        if (sortOrder !== undefined && sortOrder !== "") {
          searchUrl += "&sortOrder=" + sortOrder;
        }
        searchUrl += '&offset=' + offset + '&numResults=' + NUMBER_OF_INSTANCES;
        return $http.get(buildURI(searchUrl));
      };

      Falcon.getInstanceLog = function (logUrl) {
        return $http.get(buildURI(logUrl), {headers: {'Accept': 'text/plain'}});
      };

      Falcon.postResumeInstance = function (entityType, entityName, start, end) {
        return $http.post(buildURI('../api/instance/resume/' + entityType + '/' + entityName + '?colo=*&start=' + start + '&end=' + end));
      };

      Falcon.postSuspendInstance = function (entityType, entityName, start, end) {
        return $http.post(buildURI('../api/instance/suspend/' + entityType + '/' + entityName + '?colo=*&start=' + start + '&end=' + end));
      };

      Falcon.postKillInstance = function (entityType, entityName, start, end) {
        return $http.post(buildURI('../api/instance/kill/' + entityType + '/' + entityName + '?colo=*&start=' + start + '&end=' + end));
      };

      Falcon.postReRunInstance = function (entityType, entityName, start, end) {
        return $http.post(buildURI('../api/instance/rerun/' + entityType + '/' + entityName + '?colo=*&start=' + start + '&end=' + end));
      };

      Falcon.getEntityDependencies = function (type, name) {
        return $http.get(buildURI('../api/entities/dependencies/' + type + '/' + name));
      };

      Falcon.getInstanceVertices = function (value) {
        return $http.get(buildURI('../api/metadata/lineage/vertices?key=name&value=' + value));
      };

      Falcon.getInstanceVerticesDirection = function (id, direction) {
        return $http.get(buildURI('../api/metadata/lineage/vertices/' + id + '/' + direction));
      };

      Falcon.getInstanceVerticesProps = function (id) {
        return $http.get(buildURI('../api/metadata/lineage/vertices/properties/' + id + '?relationships=true'));
      };

      //----------------------------------------------//
      Falcon.getInstancesSummary = function (type, mode, from, to) {
        return $http.get(buildURI('../api/instance/summary/' + type + '/' + mode + '?start=' + from + '&end=' + to));
      };
      Falcon.getTopEntities = function (entityType, from, to) {
        return $http.get(buildURI('../api/entities/top/' + entityType + '?start=' + from + '&end=' + to));
      };
      //----------------------------------------------//
      Falcon.postSubmitRecipe = function (recipe) {
        return $http.post(buildURI('../api/entities/prepareAndSubmitRecipe'), recipe, {headers: {'Content-Type': 'text/plain'}});
      };

      //----Extension APIs-----//
      Falcon.getExtensionDefinition = function (type) {
        return $http.get(buildURI('../api/extension/definition/' + type), {headers: {'Accept': 'text/plain'}});
      };

      Falcon.postValidateExtension = function (extension, type) {
        return $http.post(buildURI('../api/extension/validate/' + type), extension, {headers: {'Content-Type': 'text/plain'}});
      };

      Falcon.postSubmitExtension = function (extension, type) {
        return $http.post(buildURI('../api/extension/submit/' + type), extension, {headers: {'Content-Type': 'text/plain'}});
      };

      Falcon.postUpdateExtension = function (extension, type) {
        return $http.post(buildURI('../api/extension/update/' + type), extension, {headers: {'Content-Type': 'text/plain'}});
      };

      return Falcon;

    }]);

})();
