<?php

/**
 * @file
 * Views 2 hooks and callback registries.
 */


/**
 * Implementation of hook_views_data().
 */
 
 function uc_roles_views_data() {
  $data['uc_roles_expirations']['table']['group']  = t('User');

  $data['uc_roles_expirations']['table']['join'] = array(
    'users' => array(
      'left_field' => 'uid',
      'field' => 'uid',
    ),
  );


  // Expose the role expiration date
  $data['uc_roles_expirations']['expiration'] = array(
    'title' => t('Ubercart Role expiration date/time'),
    'help' => t('Date and time the role will expire. (See also Role expiration role.)'),
    'field' => array(
      'handler' => 'views_handler_field_date',
      'click sortable' => TRUE,
    ),
    'sort' => array(
      'handler' => 'views_handler_sort_date',
    ),
    'filter' => array(
      'handler' => 'views_handler_filter_date',
    ),
  );


  // Expose the role id from uc_roles_expirations
  $data['uc_roles_expirations']['rid'] = array(
    'title' => t('Ubercart Role expiration role'),
    'help' => t('The Role that corresponds with the Role expiration date/time'),
    // Information for displaying the rid
    'field' => array(
      'handler' => 'uc_roles_handler_field_rid',
      'click sortable' => TRUE,
    ),
    // Information for accepting a rid as an argument
    'argument' => array(
      'handler' => 'views_handler_argument_users_roles_rid',
      'name field' => 'title', // the field to display in the summary.
      'numeric' => TRUE,
      'validate type' => 'rid',
    ),
    // Information for accepting a uid as a filter
    'filter' => array(
      'handler' => 'views_handler_filter_user_roles',
    ),
    // Information for sorting on a uid.
    'sort' => array(
      'handler' => 'views_handler_sort',
    ),
  );


  return $data;
}

class uc_roles_handler_field_rid extends views_handler_field {

  // Derived from views_handler_field_user_roles
  // Purpose: get the *names* that correspond to the role_expire_rids.
  function pre_render($values) {
    $roles = array();
    $this->items = array();

    // Get all the unique role ids into the keys of $roles. Initializing into
    // array_keys helps prevent us from having a list where the same rid appears
    // over and over and over.
    foreach ($values as $result) {
      $roles[$this->get_value($result, NULL, TRUE)] = FALSE;
    }

    if ($roles) {
      $result = db_query("SELECT r.rid, r.name FROM {role} r WHERE r.rid IN (:rids) ORDER BY r.name",
        array(':rids' => array_keys($roles)));
      foreach ($result as $role) {
        $this->items[$role->rid]['role'] = check_plain($role->name);
        $this->items[$role->rid]['rid'] = $role->rid;
      }
    }
  }

  // Render the rid as the role name.
  function render($values) {

    // Return the role name corresponding to the role ID.
    // TODO: Should I be using this->get_value() here?
    $rid = $values->uc_roles_expirations_rid;
    if ($rid) {
      $role = $this->items[$rid]['role'];
      if (!empty($role)) {
        return $role;
      }
    }
  }
}

