<?php

##############################################################################
#
# reminder_email.php -- 
#    email nag-o-grams as needed, presumably once per week.
#


require_once( 'core.php' );

$t_core_path = config_get( 'core_path' );

require_once( $t_core_dir . 'current_user_api.php' );
require_once( $t_core_dir . 'email_api.php' );
require_once( $t_core_dir . 'history_api.php' );
require_once( $t_core_dir . 'bug_api.php' );

$g_debug = 0;

if ($argv[1] == "-d" || $argv[1] == "--debug") {
  $g_debug = 1;
}

# Get list of all enabled projects.  Eventually, we will need a way to
# turn off email for projects which are considered "done".  Can
# probably use project status for that function.
$g_all_projects = project_get_all_rows();
$t_project_ids  = array();
foreach ($g_all_projects as $t_project) {
  if ($t_project['enabled']) 
    $t_project_ids[] = $t_project['id'];
}

#var_dump($g_all_projects);
#var_dump($t_project_ids);

# Get all users in current installation
$t_all_users = user_get_all_rows();

#var_dump($t_all_users);

# Loop through each user, looking for open and resolved issues.
foreach ($t_all_users as $t_user) {

  # skip adminstrative accounts
  if ($t_user['username'] == "administrator") { continue; }
  # if ($t_user['access_level'] >= ADMINISTRATOR) { continue; }

  # Decide if this user is a manager.  Collect all Project IDs for
  # which they are a manager
  $t_manage_ids = array();
  if ($t_user['access_level'] >= MANAGER) {
    $t_manage_ids = $t_project_ids;
  } else {
    
    $t_proj_user_list = config_get( 'mantis_project_user_list_table' );
    $query = 
      "SELECT DISTINCT project_id FROM $t_proj_user_list WHERE " .
      "user_id = " . $t_user['id'] . " AND " .
      "access_level > " . MANAGER;

    $result = db_query( $query );
    $count  = db_num_rows( $result );
    for ( $i = 0; $i < $count; $i++ ) {
      $row = db_fetch_array( $result );
      $t_manage_ids[] = (int)$row['project_id'];
    }

  }

  user_nag_message($t_user, $t_project_ids, $t_manage_ids);
}


##############################################################################
#                         F U N C T I O N S
##############################################################################


# Return all info on all users
function user_get_all_rows() {
  $t_user_table = config_get( 'mantis_user_table' );
  $query = "SELECT * FROM $t_user_table WHERE enabled = 1";
  $result = db_query( $query );
  $count  = db_num_rows( $result );
  for ( $i = 0; $i < $count; $i++ ) {
    $row = db_fetch_array( $result );
    $t_users[(int)$row['id']] = $row;
  }
  return $t_users;

} # user_get_all_rows




# Given a user, look through all issues in enabled projects 
# for three lists:
#
#   1.  Issues owned (Handled By) this user, which need to
#       be resolved.
#
#   2.  Issues reported by this user which have been resolved. 
#       The user needs to close these issues.
#
#   3.  If the user is a manager for any project, look for
#       unassigned new issues.  Remind manager to find
#       an owner for these.
#
function user_nag_message( $p_user, $p_proj_ids, $p_manage_ids ) {
  global $g_all_projects;
  global $g_debug;

  $open_count     = 0;
  $resolved_count = 0;
  $new_count      = 0;

  echo "Checking issues for " . $p_user['realname'] . "\n";

  $t_bug_table = config_get( 'mantis_bug_table' );

  # Open issues which need to be resolved
  $query = 
    "SELECT id, summary " .
    "FROM $t_bug_table WHERE status < " . RESOLVED . " AND " .
    "handler_id = " . $p_user['id'] . " AND " .
    "project_id in (" . implode(",", $p_proj_ids) . ") " .
    "ORDER BY priority DESC, id";

  $result = db_query( $query );
  $open_count = db_num_rows( $result );
  for ( $i = 0; $i< $open_count; $i++ ) {
    $row = db_fetch_array( $result );
    $t_open[(int)$row['id']] = $row;
    if ($g_debug) { echo "  Open issue " . $row['id'] . "\n"; }
  }

  # Resolved issues which need to be closed
  $query = 
    "SELECT id, summary " .
    "FROM $t_bug_table WHERE status IN (" . RESOLVED . ") AND " .
    "reporter_id = " . $p_user['id'] . " AND " . 
    "project_id in (" . implode(",", $p_proj_ids) . ") " .
    "ORDER BY priority DESC, id";

  $result = db_query( $query );
  $resolved_count = db_num_rows( $result );
  for ( $i = 0; $i< $resolved_count; $i++ ) {
    $row = db_fetch_array( $result );
    $t_resolved[(int)$row['id']] = $row;
    if ($g_debug) { echo "  Resolved issue " . $row['id'] . "\n"; }
  }

  # New issues which need to be assigned
  if (count($p_manage_ids) > 0) {
    
    $query = 
      "SELECT id, summary " .
      "FROM $t_bug_table WHERE status IN (" . NEW_ . ") AND " .
      "project_id in (" . implode(",", $p_manage_ids) . ") " .
      "ORDER BY priority DESC, id";    
    
    $result = db_query( $query );
    $new_count = db_num_rows( $result );
    for ( $i = 0; $i< $new_count; $i++ ) {
      $row = db_fetch_array( $result );
      $t_new[(int)$row['id']] = $row;
      if ($g_debug) { echo "  New issue " . $row['id'] . "\n"; }
    }    
  }

  
  # If nothing worth nagging about has been found, just return
  if ($open_count == 0 &&
      $resolved_count == 0 &&
      $new_count == 0) {
    return;
  }

  #
  # ...otherwise, construct the nag message !!
  #

  $t_padding = config_get( 'display_bug_padding' );
  $t_host    = getenv('HOSTNAME');

  $subject = "Mantis reminder";

  $message = "This message is a reminder from Mantis.\n\n";
  # %%% FIXME: URL should be generic
  $message .= "    http://wally/mantis/" . config_get( 'default_home_page' );
  $message .= "\n\n\n";

  $message .= "The issues listed below are sorted in priority order.\n\n\n";

  if ($open_count > 0) {
    $message .= "The following open issues need to be resolved: \n";
    $message .= str_pad('', 78, '-') . "\n";

    foreach ($t_open as $issue) {
      $message .= str_pad( $issue['id'], $t_padding, ' ', STR_PAD_LEFT ) . " ";
      $message .= $issue['summary'];
      $message .= "\n";
    }
    $message .= "\n\n";
  }



  if ($resolved_count > 0) {
    $message .= "The following resolved issues need to be closed: \n";
    $message .= str_pad('', 78, '-') . "\n";

    foreach ($t_resolved as $issue) {
      $message .= str_pad( $issue['id'], $t_padding, ' ', STR_PAD_LEFT ) . " ";
      $message .= $issue['summary'];
      $message .= "\n";
    }
    $message .= "\n\n";
  }



  if ($new_count > 0) {
    $message .= "The following NEW issues need to be assigned: \n";
    $message .= str_pad('', 78, '-') . "\n";

    foreach ($t_new as $issue) {
      $message .= str_pad( $issue['id'], $t_padding, ' ', STR_PAD_LEFT ) . " ";
      $message .= $issue['summary'];
      $message .= "\n";
    }
    $message .= "\n\n";
  }
  
  if ($g_debug) {  
    echo $message;
  } else {
    email_send( $p_user['email'], $subject, $message, "", "", false);
  }

} # user_nag_message

?>
