#!/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] [mailid]"
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
}

MAILID=
# 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 "$MAILID" ]]; then
                    MAILID="$1"
                else
                    usage "Invalid parameter '$opt'"
                fi
        esac
        ((idx++))
    done
}
handle_args "$@"
[[ -z "$MAILID" ]] && usage
[[ "${MAX_LOG:-null}" == "null" ]] && MAX_LOG=$DEFAULT_MAX_LOG
[[ "${MAIL_LOG_PATH:-null}" == "null" ]] && MAIL_LOG_PATH=$POSTFIX_GENERAL_LOG_PATH

function search_mailid () {
    local mailid=$1 maillog=$2
    [ ! -f "$maillog" ] && maillog="$maillog.gz"
    [ -f "$maillog" ] && zgrep -F "$mailid" "$maillog" | head -n 1 | \
        sed 's/^.*\: \([^\:]*\): message-id.*$/\1/'
}

debug "Search mail ID from message ID $MAILID ..."
res=$( search_mailid "$MAILID" "$MAIL_LOG_PATH" )
if [ -n "$res" ]; then
    echo "$res"
    exit 0
else
    debug "Not found from log file $MAIL_LOG_PATH. Try with archive (Max : $MAX_LOG)"
    for i in $( seq 1 "$MAX_LOG" ); do
        res=$( search_mailid "$MAILID" "$MAIL_LOG_PATH.$i" )
        if [ -n "$res" ]; then
            debug "Found from log file $MAIL_LOG_PATH.$i"
            echo "$res"
            exit 0
        else
            debug "Not found from log file $MAIL_LOG_PATH.$i"
        fi
    done
    debug "Not found in archive (Max : $MAX_LOG)"
fi
exit 1
