/*
 * app.api.js
 * Ajax api helper module
 */

/*jslint         browser : true, continue : true,
  devel  : true, indent  : 2,    maxerr   : 50,
  newcap : true, nomen   : true, plusplus : true,
  regexp : true, sloppy  : true, vars     : false,
  white  : true
*/
/*global $, io, app */

app.api = (function() {
  "use strict";
  var initModule,
    getAuthHeaderObject,
    RockFishVersion,
    get,
    remove,
    create,
    update,
    uploadFile,
    putAction,
    createLicense,
    getLicenseRequests,
    generateFromRequest,
    licenseEmailResponse;

  RockFishVersion = "6.6";

  //////////////////////////////////////////////////////////////////////////////////////
  //         NOT AUTHORIZED ERROR HANDLER

  $(document).ajaxError(function(event, jqxhr, settings, thrownError) {
    //unauthorized?  Trigger logout which will trigger login after clearing creds
    if (jqxhr.status == 401) {
      window.location.replace("#!/logout");
    }
  });

  //////////////////////////////////////////////////////////////////////////////////////
  //         UTILITY

  ///////////////////////////////////////////////////////////
  // Return the auth token header
  //
  //
  getAuthHeaderObject = function() {
    return {
      Authorization: "Bearer " + app.shell.stateMap.user.token
    };
  };

  //////////////////////////////////////////////////////////////////////////////////////
  //      ROCKFISH CORE ROUTES

  ///////////////////////////////////////////////////////////
  //Create
  //Route app.post('/api/:obj_type/create', function (req, res) {
  //
  create = function(apiRoute, objData, callback) {
    $.ajax({
      method: "post",
      dataType: "json",
      url: app.shell.stateMap.apiUrl + apiRoute,
      headers: getAuthHeaderObject(),
      contentType: "application/json; charset=utf-8",
      data: JSON.stringify(objData),
      success: function(data, textStatus) {
        callback(data);
      },
      error: function(jqXHR, textStatus, errorThrown) {
        callback({
          error: 1,
          msg: textStatus + "\n" + errorThrown,
          error_detail: {}
        });
      }
    });
  };

  /////////////////
  //Get - get anything, the caller provides the route, this should replace most legacy get
  //
  get = function(apiRoute, callback) {
    $.ajax({
      method: "GET",
      dataType: "json",
      url: app.shell.stateMap.apiUrl + apiRoute,
      headers: getAuthHeaderObject(),

      success: function(data, textStatus) {
        callback(data);
      },
      error: function(jqXHR, textStatus, errorThrown) {
        callback({
          error: 1,
          msg: textStatus + "\n" + errorThrown,
          error_detail: {}
        });
      }
    });
  };
  ////////////////////

  ///////////////////////////////////////////////////////////
  //Update
  //route: app.post('/api/:obj_type/update/:id', function (req, res) {
  //
  update = function(objType, objData, callback) {
    var theId;
    if (!objData.id) {
      return callback({
        error: 1,
        msg: "app.api.js::update->Error: missing id field in update document",
        error_detail: objData
      });
    }
    theId = objData.id;
    $.ajax({
      method: "put",
      dataType: "json",
      url: app.shell.stateMap.apiUrl + objType + "/" + theId,
      headers: getAuthHeaderObject(),
      contentType: "application/json; charset=utf-8",
      data: JSON.stringify(objData),
      success: function(data, textStatus) {
        if (data == null) {
          data = { ok: 1 };
        }

        callback(data);
      },
      error: function(jqXHR, textStatus, errorThrown) {
        callback({
          error: 1,
          msg: textStatus + "\n" + errorThrown,
          error_detail: {}
        });
      }
    });
  };

  ///////////////////////////////////////////////////////////
  //remove Item
  remove = function(apiRoute, callback) {
    $.ajax({
      method: "DELETE",
      dataType: "json",
      url: app.shell.stateMap.apiUrl + apiRoute,
      headers: getAuthHeaderObject(),
      success: function(data, textStatus) {
        callback(data);
      },
      error: function(jqXHR, textStatus, errorThrown) {
        callback({
          error: 1,
          msg: textStatus + "\n" + errorThrown,
          error_detail: {}
        });
      }
    });
  };

  ///////////////////////////////////////////////////////////
  // uploadFile
  // (ajax route to upload a file)
  //
  uploadFile = function(apiRoute, objData, callback) {
    $.ajax({
      method: "post",
      dataType: "json",
      url: app.shell.stateMap.apiUrl + apiRoute,
      headers: getAuthHeaderObject(),
      contentType: false,
      processData: false,
      data: objData,
      success: function(data, textStatus) {
        callback(data);
      },
      error: function(jqXHR, textStatus, errorThrown) {
        callback({
          error: 1,
          msg: textStatus + "\n" + errorThrown,
          error_detail: {}
        });
      }
    });
  };

  //////////////////////////////////////////////////////////////
  //putAction - ad-hoc put method used to trigger actions etc
  //
  putAction = function(apiRoute, callback) {
    $.ajax({
      method: "put",
      dataType: "json",
      url: app.shell.stateMap.apiUrl + apiRoute,
      headers: getAuthHeaderObject(),
      contentType: "application/json; charset=utf-8",
      //data: JSON.stringify(objData),
      success: function(data, textStatus) {
        if (data == null) {
          data = { ok: 1 };
        }

        callback(data);
      },
      error: function(jqXHR, textStatus, errorThrown) {
        callback({
          error: 1,
          msg: textStatus + "\n" + errorThrown,
          error_detail: {}
        });
      }
    });
  };
  //////////////////////////////////////////////////////////////////////////////////////
  //         LICENSE KEY RELATED API METHODS

  ///////////////////////////////////////////////////////////
  //CreateLicense
  //Route app.post('/api/license/create', function (req, res) {
  //
  createLicense = function(objData, callback) {
    $.ajax({
      method: "post",
      dataType: "text",
      url: app.shell.stateMap.apiUrl + "license/generate",
      headers: getAuthHeaderObject(),
      contentType: "application/json; charset=utf-8",
      data: JSON.stringify(objData),
      success: function(data, textStatus) {
        callback(data);
      },
      error: function(jqXHR, textStatus, errorThrown) {
        callback({
          error: 1,
          msg: textStatus + "\n" + errorThrown,
          error_detail: {}
        });
      }
    });
  };

  ///////////////////////////////////////////////////////////
  //GetLicenseRequests
  //Fetch license requests
  //route: app.get('/api/license/requests', function (req, res) {
  //
  getLicenseRequests = function(callback) {
    $.ajax({
      method: "GET",
      dataType: "json",
      url: app.shell.stateMap.apiUrl + "license/requests",
      headers: getAuthHeaderObject(),
      success: function(data, textStatus) {
        callback(data);
      },
      error: function(jqXHR, textStatus, errorThrown) {
        callback({
          error: 1,
          msg: textStatus + "\n" + errorThrown,
          error_detail: {}
        });
      }
    });
  };

  ///////////////////////////////////////////////////////////
  //GenerateFromRequest
  //Fetch generated response to license request
  //route: app.get('/api/license/generateFromRequest/:uid', function (req, res) {
  //
  generateFromRequest = function(uid, callback) {
    $.ajax({
      method: "GET",
      dataType: "json",
      url: app.shell.stateMap.apiUrl + "license/generateFromRequest/" + uid,
      headers: getAuthHeaderObject(),
      success: function(data, textStatus) {
        callback(data);
      },
      error: function(jqXHR, textStatus, errorThrown) {
        callback({
          error: 1,
          msg: textStatus + "\n" + errorThrown,
          error_detail: {}
        });
      }
    });
  };

  ///////////////////////////////////////////////////////////
  //Email license request response
  //app.post('/api/license/email_response', function (req, res) {
  //
  licenseEmailResponse = function(objData, callback) {
    $.ajax({
      method: "post",
      dataType: "text",
      url: app.shell.stateMap.apiUrl + "license/email_response",
      headers: getAuthHeaderObject(),
      contentType: "application/json; charset=utf-8",
      data: JSON.stringify(objData),
      success: function(data, textStatus) {
        callback(data);
      },
      error: function(jqXHR, textStatus, errorThrown) {
        callback({
          error: 1,
          msg: textStatus + "\n" + errorThrown,
          error_detail: {}
        });
      }
    });
  };

  initModule = function() {};

  return {
    initModule: initModule,
    getAuthHeaderObject: getAuthHeaderObject,
    RockFishVersion: RockFishVersion,
    get: get,
    remove: remove,
    create: create,
    update: update,
    uploadFile: uploadFile,
    putAction: putAction,
    createLicense: createLicense,
    getLicenseRequests: getLicenseRequests,
    generateFromRequest: generateFromRequest,
    licenseEmailResponse: licenseEmailResponse
  };
})();
