<?php

/**
 * @file support_nag.module
 */

define('ACTION_NOTIFY', 0);
define('ACTION_CHANGE', 1);

/**
 * Implementation of hook_cron().
 * Send nags.
 */
function support_nag_cron() {
  // Perform global operations
  $states = _support_states();
  $closed = _support_get_state(SUPPORT_STATE_CLOSED);
  foreach ($closed as $close) {
    unset($states[$close]);
  }
  $default_closed = array_pop($closed);
  foreach ($states as $sid => $state) {
    $closed = variable_get('support_nag_autoclose_close_state', $default_closed);
    $autoclose = variable_get("support_nag_autoclose_$state", 0);
    if ($autoclose) {
      $result = db_query('SELECT DISTINCT(n.nid), GREATEST(n.changed, l.last_comment_timestamp) AS last_updated FROM {node} n LEFT JOIN {support_ticket} t ON n.nid = t.nid INNER JOIN {node_comment_statistics} l ON n.nid = l.nid WHERE t.state = :state', array(':state' => $sid));
      foreach ($result as $ticket) {
        if ($ticket->last_updated < time() - $autoclose) {
          $ticket = node_load($ticket->nid);
          $replace = array(
            'support-autoclose' => $ticket,
          );
          $comment = (object) array(
            'nid' => $ticket->nid,
            'comment_body' => array(LANGUAGE_NONE => array()),
            'state' => $closed,
            'priority' => $ticket->priority,
            'client' => $ticket->client,
            'assigned' => $ticket->assigned,
          );
          $comment->comment_body[LANGUAGE_NONE][] = array(
            'format' => filter_default_format(),
            'value' => token_replace(variable_get('support_nag_autoclose_text', t('This ticket has been automatically marked [support-autoclose:closed-state] as it has been inactive for over [support-autoclose:inactive-limit]. You may re-open the ticket if this is in error or you have further updates.')), $replace),
          );
          comment_save($comment);
        }
      }
    }
  }

  // perform notification actions
  $result = db_query('SELECT nagid, action, mailto, clients, states, priorities, assigned, subject, message, last, frequency FROM {support_nags} WHERE action = :action', array(':action' => ACTION_NOTIFY));
  foreach ($result as $nag) {
    if ($nag->last < (time() - $nag->frequency)) {
      db_update('support_nags')
        ->fields(array(
          'last' => time(),
        ))
        ->expression('count', 'count + 1')
        ->condition('nagid', $nag->nagid)
        ->execute();

      // TODO: Ugly query!
      $query = db_select('node', 'n');
      $query->join('support_ticket', 't', 'n.nid = t.nid');
      $query
        ->fields('n', array('nid'))
        ->orderBy('state')
        ->orderBy('priority', 'DESC')
        ->orderBy('client');

      if ($nag->clients) {
        $query->condition('client', $nag->clients);
      }
      if ($nag->states) {
        $query->condition('state', $nag->states);
      }
      if ($nag->priorities) {
        $query->condition('priority', $nag->priorities);
      }
      if ($nag->assigned) {
        $query->condition('assigned', $nag->assigned);
      }

      $nids = $query->execute()->fetchCol();
      $params = array();
      $params['subject'] = token_replace($nag->subject, array('support-notify' => $nids));
      $params['body'] = token_replace($nag->message, array('support-notify' => $nids));
      $mailfrom = variable_get('support_global_mailfrom', '');
      $uids = explode(',', $nag->mailto);
      foreach ($uids as $uid) {
        $mailto = db_query('SELECT mail FROM {users} WHERE uid = :uid', array(':uid' => $uid))->fetchField();
        $mail = drupal_mail('support_nag', 'notify', $mailto, NULL, $params, $mailfrom);
      }
    }
  }
}

function support_nag_mail($key, &$message, $params) {
  $language = $message['language'];
  $message['subject'] = $params['subject'];
  $message['body'][] = $params['body'];
}

/**
 * Implements hook_permission().
 */
function support_nag_permission() {
  return array(
    'administer support nag' => array(
      'title' => t('Administer support nag'),
    ),
  );
}

/**
 * Implements hook_menu().
 */
function support_nag_menu() {
  $items['admin/support/nag'] = array(
    'title' => 'Nags',
    'description' => 'Configure support nags.',
    'page callback' => 'support_nag_admin_overview',
    'access arguments' => array('administer support nag'),
    'file' => 'support_nag.admin.inc',
  );
  $items['admin/support/nag/action'] = array(
    'title' => 'Actions',
    'type' => MENU_DEFAULT_LOCAL_TASK,
    'weight' => -1,
  );
  $items['admin/support/nag/action/list'] = array(
    'title' => 'List',
    'type' => MENU_DEFAULT_LOCAL_TASK,
    'weight' => -1,
  );
  $items['admin/support/nag/action/create'] = array(
    'title' => 'Create',
    'type' => MENU_LOCAL_TASK,
    'description' => 'Create support nag',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('support_nag_admin_actions'),
    'access arguments' => array('administer support nag'),
    'file' => 'support_nag.admin.inc',
  );
  $items['admin/support/nag/action/%support_nag_action/edit'] = array(
    'type' => MENU_CALLBACK,
    'page callback' => 'drupal_get_form',
    'page arguments' => array('support_nag_admin_actions', 4),
    'access arguments' => array('administer support nag'),
    'file' => 'support_nag.admin.inc',
  );
  $items['admin/support/nag/settings'] = array(
    'title' => 'Settings',
    'type' => MENU_LOCAL_TASK,
    'page callback' => 'drupal_get_form',
    'page arguments' => array('support_nag_admin_settings'),
    'access arguments' => array('administer support nag'),
    'file' => 'support_nag.admin.inc',
  );
  $items['support/autocomplete/user'] = array(
    'title' => 'Autocomplete user',
    'page callback' => 'support_nag_autocomplete_user',
    'access arguments' => array('access user profiles'),
    'type' => MENU_CALLBACK,
    'file' => 'support_nag.admin.inc',
  );
  return $items;
}

function _support_nag_truncate($text, $length = 32, $maxmin = FALSE) {
  if (strlen($text) >= $length) {
    $text = substr($text, 0, $length) . '...';
  }
  if ($maxmin) {
    if (strlen($text) > $length) {
      while (strlen($text) > ($length - 2)) {
        $text = substr($text, 0, strlen($text) - 1);
      }
      $text .= '..';
    }
    while (strlen($text) < $length) {
      $text .= ' ';
    }
  }
  return $text;
}

function support_nag_action_load($nagid) {
  return db_query('SELECT * FROM {support_nags} WHERE nagid = :nagid', array(':nagid' => $nagid))->fetch();
}
