<?php # vim: set filetype=php expandtab tabstop=2 shiftwidth=2 autoindent smartindent:

/*
  ERROR: warning: require_once(modules/system/user_queue_member.admin.inc) [function.require-once]: failed to open stream: No such file or directory in /data/projects/voip_support/trunk/control_interface/includes/menu.inc on line 344.
  WHEN I GET ERROR: I get error when I go to "admin/user/user_queue_member"
  NOTE: admin/user/user_queue_member is defined in user_queue_member_menu() ..
*/

define('USER_QUEUE_MEMBER_PHONE_NUMBER', 'USER_QUEUE_MEMBER_PHONE_NUMBER');

/* TODO: add an admin settings where user can create the phone number field or assign something .. */

function user_queue_member_enable() {
  /* Add phone number field in profile.module */
  if(module_exists('profile')) {
    /* XXX we are not using drupal_execute(), so validation is left apart .. BAD ! */
    if(db_query("INSERT INTO {profile_fields} (title, name, explanation, category, type, weight, required, register, visibility, autocomplete, options, page) VALUES ('%s', '%s', '%s', '%s', '%s', %d, %d, %d, %d, %d, '%s', '%s')", 'Phone Number', 'phone_number', '', 'Account Information', 'textfield', 4/* weight */, 1, 1, 0, 0, NULL, NULL)) {
      $fid = db_last_insert_id('profile_fields', 'fid');
      variable_set(USER_QUEUE_MEMBER_PHONE_NUMBER, $fid);
    }
  }
}

function user_queue_member_perm() {
  return array('can be queue member');
}

function user_queue_member_help($path, $arg) {
  /* TODO: say that activating profile will add support to calling the user by phone, and activating user_sip will enable calling using sip account .. */
  switch($path) {
    case 'user/%user/queue_member' :
    return 'Asterisk queue membership details.';
  }
}

function user_queue_member_menu() {
  return array(
    'user/%user/queue_member' => array(
      'title' => 'Asterisk queue membership',
      'description' => 'Asterisk queue membership details.',
      'page callback' => 'user_queue_member_details',
      'page arguments' => array(1),
      'access callback' => 'user_is_queue_member',
      'access arguments' => array(1),
      'file' => 'user_queue_member.pages.inc',
      'type' => MENU_LOCAL_TASK,
    )
    ,'user/%user/queue_member/list' => array(
      'title' => 'List',
      'type' => MENU_DEFAULT_LOCAL_TASK,
      'weight' => 0,
    )
    ,'user/%user/queue_member/add' => array(
      'title' => 'Add',
      'description' => t('Be a new queue member.'),
      'page callback' => 'node_add',
      'page arguments' => array('queue_member', 1),
      'access callback' => 'node_access',
      'access arguments' => array('create', 'queue_member'),
      'file' => 'user_queue_member.node.pages.wrapper.inc',
      'type' => MENU_LOCAL_TASK,
      'weight' => 1,
    )
    ,'user/%user/queue_member/%node' => array(
      'title' => 'Edit',
      'description' => 'Asterisk queue membership details.',
      'page arguments' => array('user_queue_member_details', 1),
      'access callback' => 'user_is_queue_member',
      'access arguments' => array(1),
      'file' => 'user_queue_member.pages.inc',
      'type' => MENU_LOCAL_TASK,
      'weight' => 2,
    )
    ,'admin/user/user_queue_member' => array(
      'title' => 'User queue member',
      'description' => 'User Queue Member Settings.',
      'page arguments' => array('user_queue_member_admin'),
      'access arguments' => array('administer users'),
      'file' => 'user_queue_member.admin.inc',
    )
    ,'admin/user/user_queue_member/autocomplete' => array(
      'title' => 'Profile field name autocomplete',
      'page callback' => 'user_queue_member_admin_autocomplete',
      'type' => MENU_CALLBACK,
      'file' => 'user_queue_member.admin.inc',
    )
  );
}

function user_is_queue_member($account) {
  global $user;
  /* 
   * if I omit the following check it creates
   * following error:
   * ==========================================================
   * warning: array_fill() [function.array-fill]: Number of elements must be positive in /data/projects/voip_support/trunk/control_interface/includes/database.inc on line 235.
   * warning: implode() [function.implode]: Bad arguments. in /data/projects/voip_support/trunk/control_interface/includes/database.inc on line 235.
   * warning: array_keys() [function.array-keys]: The first argument should be an array in /data/projects/voip_support/trunk/control_interface/modules/user/user.module on line 500.
   * user warning: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1 query: SELECT p.perm FROM web_role r INNER JOIN web_permission p ON p.rid = r.rid WHERE r.rid IN () in /data/projects/voip_support/trunk/control_interface/modules/user/user.module on line 500.
   * ==========================================================
   * The probable reason is $account->role is not assigned when user_access() is called. Note that I called this in hook_user implementation which is called before all the node elements are loaded.
   */
  if(!is_array($account->roles)) {
    return FALSE;
  }
  if($account->uid == 1) {
    return FALSE; /* forbid the admin user.. */
  }
  if(!user_access('can be queue member', $account)) {
    return FALSE;
  }
  if($account->uid == $user->uid || user_access('administer users', $user)) {
    return TRUE;
  }
  return FALSE;
}

function user_queue_member_user($op, &$edit, &$account, $category = NULL) {
  if(!user_is_queue_member($account)) {
    return;
  }
  switch($op) {
  case 'view':
    /* TODO: show the queues we are member of .. */
    return;
  case 'delete':
    $result = db_query(db_rewrite_sql('SELECT n.nid FROM {user_queue_member} n WHERE uid = %d'), $account->uid);
    while ($node = db_fetch_object($result)) {
      node_delete(node_load($node->nid));
    }
    return;
  }
}

function user_queue_member_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
  if($node->type != 'queue_member') {
    return;
  }
  /* handle delete */
  switch($op) {
  case 'delete':
    db_query(
      'DELETE FROM {user_queue_member} WHERE nid = %d'
      , $node->nid
    );
    return;
  }
  /* check if we are working under a specific user */
  $params = arg();
  if(!$params[1]) {
    return;
  }
  $account = user_load($params[1]);
  if(!$account || !$account->uid) {
    return;
  }
  switch($op) {
  case 'insert':
    /* associate the node with that user */
    db_query(
      'INSERT INTO {user_queue_member} SET uid = %d, nid = %d'
      , $node->related_user
      , $node->nid
    );
    drupal_set_message(t("You are now member of {$node->queue} queue"));
    drupal_redirect_form($form, "user/{$node->related_user}/queue_member/list");
    break;
  }
}

function user_queue_member_form_alter(&$form, $form_state, $form_id) {
  if($form_id != 'queue_member_node_form') {
    return;
  }
  $params = arg();
  if(!$params[1]) {
    return;
  }
  $account = user_load($params[1]);
  if(!$account || !$account->uid) {
    return;
  }
  $form['related_user'] = array(
    '#type' => 'value'
    ,'#value' => $account->uid
  );
}

function user_queue_member_queue_member($op, $data = NULL) {
  switch($op) {
  case 'title':
    $params = arg();
    if($params[0] != 'user' || !$params[1]) {
      return;
    }
    $account = user_load($params[1]);
    if(!$account || !$account->uid) {
      return;
    }
    if(_user_queue_member_get_profile_field()) {
      $result['user_phone'] = 'User Phone Number';
    }
    if(module_exists('user_sip')) {
      $result['user_sip'] = 'User sip account';
    }
    return $result;
  }
}

function _user_queue_member_get_profile_field() {
  return db_fetch_object(db_query('SELECT f.name, f.fid FROM {profile_fields} f WHERE f.fid = %d', variable_get(USER_QUEUE_MEMBER_PHONE_NUMBER, 0)));
}
