$(function () {
  "use strict";

  // ------------------------- GLOBAL definitions -------------------------
  var gridsUrl = '/include/grids.php';

  function deleteFormatter() {
    return "<span class='glyphicon glyphicon-remove action'></span";
  }

  function refreshTable($table) {
    $table.bootstrapTable('refresh');
  }

  function onAjaxError (xhr, textStatus, error) {
    console.error(error);
    alert('Error: ' + textStatus);
  }

  // ------------------------- USERS definitions -------------------------
  var $userTable = $('#table-users');
  var $modalUserAdd = $('#modal-user-add');
  var $userAddSave = $modalUserAdd.find('#modal-user-add-save');

  function addUser(username, password) {
    $.ajax({
      url: gridsUrl,
      method: 'POST',
      data: {
        add_user: true,
        user_id: username,
        user_pass: password
      },
      success: function() {
        refreshTable($userTable);
      },
      error: onAjaxError
    });
  }

  function deleteUser(user_id) {
    $.ajax({
      url: gridsUrl,
      data: {
        del_user: true,
        del_user_id: user_id
      },
      method: 'POST',
      success: function() {
        refreshTable($userTable);
      },
      error: onAjaxError
    });
  }

  var userEditable = {
    url: gridsUrl,
    params: function (params) {
      params.set_user = true;

      return params;
    },
    success: function () {
      refreshTable($userTable);
    }
  }

  // ES 2015 so be prudent
  if (typeof Object.assign == 'function') {
    var userDateEditable = Object.assign({ type: 'date', placement: 'bottom' }, userEditable);
  } else {
    console.warn('Your browser does not support Object.assign. You will not be able to modify the date inputs.');
  }


  // ------------------------- ADMIN definitions -------------------------
  var $adminTable = $('#table-admins');
  var $modalAdminAdd = $('#modal-admin-add');
  var $adminAddSave = $modalAdminAdd.find('#modal-admin-add-save');

  function addAdmin(username, password) {
    $.ajax({
      url: gridsUrl,
      method: 'POST',
      data: {
        add_admin: true,
        admin_id: username,
        admin_pass: password
      },
      success: function() {
        refreshTable($adminTable);
      },
      error: onAjaxError
    });
  }

  function deleteAdmin(admin_id) {
    $.ajax({
      url: gridsUrl,
      data: {
        del_admin: true,
        del_admin_id: admin_id
      },
      method: 'POST',
      success: function() {
        refreshTable($adminTable);
      },
      error: onAjaxError
    });
  }

  var adminEditable = {
    url: gridsUrl,
    params: function (params) {
      params.set_admin = true;

      return params;
    },
    success: function () {
      refreshTable($adminTable);
    }
  }

  // ------------------------- ADMIN definitions -------------------------
  var $logTable = $('#table-logs');


  // -------------------- USERS --------------------

  // Bootstrap table definition
  $userTable.bootstrapTable({
    url: gridsUrl,
    sortable: false,
    queryParams: function (params) {
      params.select = 'user';
      return params;
    },
    // Primary key
    idField: 'user_id',
    columns: [
      { title: "ID", field: "user_id", editable: userEditable },
      { title: "Pass", field: "user_pass", editable: userEditable },
      { title: "Mail", field: "user_mail", editable: userEditable },
      { title: "Phone", field: "user_phone", editable: userEditable },
      { title: "Online", field: "user_online" },
      { title: "Enabled", field: "user_enable" },
      { title: "Start Date", field: "user_start_date", editable: userDateEditable },
      { title: "End Date", field: "user_end_date", editable: userDateEditable },
      {
        title: 'Delete',
        field: "user_del",
        formatter: deleteFormatter,
        events: {
          'click .glyphicon': function (e, value, row) {
            if (confirm('Are you sure you want to delete this user?')) {
              deleteUser(row.user_id);
            }
          }
        }
      }
    ]
  });

  // When we want to add a user
  $userAddSave.on('click', function () {
    var $usernameInput = $modalUserAdd.find('input[name=username]');
    var $passwordInput = $modalUserAdd.find('input[name=password]');
    addUser($usernameInput.val(), $passwordInput.val());
    $modalUserAdd.modal('hide');
  });


  // -------------------- ADMINS --------------------

  // Bootstrap table definition
  $adminTable.bootstrapTable({
    url: gridsUrl,
    sortable: false,
    queryParams: function (params) {
      params.select = 'admin';
      return params;
    },
    // Primary key
    idField: 'admin_id',
    columns: [
      { title: "ID", field: "admin_id", editable: adminEditable },
      { title: "Pass", field: "admin_pass", editable: adminEditable },
      {
        title: 'Delete',
        field: "admin_del",
        formatter: deleteFormatter,
        events: {
          'click .glyphicon': function (e, value, row) {
            if (confirm('Are you sure you want to delete this admin?')) {
              deleteAdmin(row.admin_id);
            }
          }
        }
      }
    ]
  });

  // When we want to add a user
  $adminAddSave.on('click', function () {
    var $usernameInput = $modalAdminAdd.find('input[name=username]');
    var $passwordInput = $modalAdminAdd.find('input[name=password]');
    addAdmin($usernameInput.val(), $passwordInput.val());
    $modalAdminAdd.modal('hide');
  });

  // -------------------- LOGS --------------------

  // Bootstrap table definition
  $logTable.bootstrapTable({
    url: gridsUrl,
    sortable: false,
    sidePagination: 'server',
    pagination: true,
    queryParams: function (params) {
      params.select = 'log';
      return params;
    },
    columns: [
      { title: "Log ID", field: "log_id" },
      { title: "User ID", field: "user_id" },
      { title: "Trusted IP", field: "log_trusted_ip" },
      { title: "Trusted Port", field: "log_trusted_port" },
      { title: "Remote IP", field: "log_remote_ip" },
      { title: "Remote Port", field: "log_remote_port" },
      { title: "Start Time", field: "log_start_time" },
      { title: "End Time", field: "log_end_time" },
      { title: "Receveid", field: "log_received" },
      { title: "Sent", field: "log_send" }
    ]
  });
});