#!/bin/bash
# vim: shiftwidth=4 tabstop=4 expandtab

LIB_DIR="$( realpath "$( dirname "$( realpath "$0" )" )/../lib/ee-postfix-tools" )"
if [[ -e "$LIB_DIR/common" ]]; then
    # shellcheck source=/dev/null
    source "$LIB_DIR/common"
else
    echo "Failed to load ee-postfix-tools common lib"
    exit 1
fi

# shellcheck disable=SC2034
EXTRA_SHORT_USAGE="[-m X] [-l /path/to/mail.log] [username]"
DEFAULT_MAX_LOG=9

# shellcheck disable=SC2317,SC2329
function extra_usage() {
    cat << EOF
    -l|--log-path /path/to/mail.log  Postfix mail log path to look in
                                     (default: $POSTFIX_GENERAL_LOG_PATH)
    -m|--max-log X                   Max log files to look in (default: $DEFAULT_MAX_LOG)
EOF
}

USERNAME=
# shellcheck disable=SC2317,SC2329
function handle_extra_args() {
    local idx=1 opt
    while [[ $idx -le $# ]]; do
        opt=${!idx}
        case "$opt" in
            -l|--log-path)
                ((idx++))
                MAIL_LOG_PATH="${!idx}"
                [[ -e "$MAIL_LOG_PATH" ]] || usage "$MAIL_LOG_PATH not found"
            ;;
            -m|--max-log)
                ((idx++))
                MAX_LOG="${!idx}"
                check_int "$MAX_LOG" 1 || \
                    usage "Invalid max log specified: must be an integer >= 1"
            ;;
            *)
                if [[ -z "$USERNAME" ]]; then
                    USERNAME="$opt"
                else
                    usage "Invalid parameter '$opt'"
                fi
        esac
        ((idx++))
    done
}
handle_args "$@"
[[ -z "$USERNAME" ]] && usage
[[ "${MAX_LOG:-null}" == "null" ]] && MAX_LOG=$DEFAULT_MAX_LOG
[[ "${MAIL_LOG_PATH:-null}" == "null" ]] && MAIL_LOG_PATH=$POSTFIX_GENERAL_LOG_PATH

function search_user () {
    local user="$1" maillog="$2"
    [ ! -f "$maillog" ] && maillog="$maillog.gz"
    [ -f "$maillog" ] && zgrep -E ".*: [A-Z0-9]*: client=.*, sasl_username=$user\$" "$maillog" | \
        sed 's/.*: \([A-Z0-9]*\): client=.*$/\1/'
}

search_user "$USERNAME" "$MAIL_LOG_PATH"
for i in $( seq 1 "$MAX_LOG" ); do
    search_user "$USERNAME" "$MAIL_LOG_PATH.$i"
done
