<?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_api('current_user_api.php');
require_api('database_api.php');
require_api('email_api.php');
require_api('history_api.php');
require_api('bug_api.php');

$is_cli = php_sapi_name() === "cli";

# If running from the web, force authentication and render the layout
if ( !$is_cli ) {
    auth_reauthenticate();
    access_ensure_global_level( config_get( 'manage_site_threshold' ) );

    layout_page_header( lang_get( 'manage_link' ) );

    layout_page_begin();
}

$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 {

        db_param_push();
        $query =
            "SELECT DISTINCT project_id FROM {project_user_list} WHERE " .
            "user_id = " . db_param() . " AND " .
            "access_level > " . db_param();

    $result = db_query($query, array($t_user['id'], MANAGER));
    $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);
}

if ( !$is_cli ) {
    layout_page_end();
}

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


# Return all info on all users
function user_get_all_rows()
{

    db_param_push();

    $query = "SELECT * FROM {user} WHERE enabled = " . db_param();

    $result = db_query($query, array(1));
    $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;
    global $is_cli;

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

    echo "Checking issues for " . $p_user['realname'] . ($is_cli ? "\n" : "<br>");

    # Open issues which need to be resolved
    db_param_push();
    $query =
        "SELECT id, summary " .
        "FROM {bug} WHERE status < " . db_param() . " AND " .
        "handler_id = " . db_param() . " AND " .
        "project_id in (" . implode(",", $p_proj_ids) . ") " .
        "ORDER BY priority DESC, id";

    $result = db_query($query, array(RESOLVED, $p_user['id']));
    $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
    db_param_push();
    $query =
        "SELECT id, summary " .
        "FROM {bug} WHERE status IN (" . db_param() . ") AND " .
        "reporter_id = " . db_param() . " AND " .
        "project_id in (" . implode(",", $p_proj_ids) . ") " .
        "ORDER BY priority DESC, id";

    $result = db_query($query, array(RESOLVED, $p_user['id']));
    $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 {bug} WHERE status IN (" . db_param() . ") AND " .
            "project_id in (" . implode(",", $p_manage_ids) . ") " .
            "ORDER BY priority DESC, id";

        $result = db_query($query, array( NEW_ ));
        $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";

    $t_url = config_get_global( 'path' ) . config_get_global( 'default_home_page' );
    $message .= "    $t_url";
    $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 .= "(" . string_get_bug_view_url_with_fqdn($issue['id']) . ")";
            $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 .= "(" . string_get_bug_view_url_with_fqdn($issue['id']) . ")";
            $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 .= "(" . string_get_bug_view_url_with_fqdn($issue['id']) . ")";
            $message .= "\n";
        }
        $message .= "\n\n";
    }

    if ($g_debug) {
        echo $message;
    } else {
        $emailData = new EmailData();
        $emailData->email = $p_user['email'];
        $emailData->subject = $subject;
        $emailData->body = $message;

        email_send($emailData);
    }

} # user_nag_message

?>
