#!/usr/bin/env python

"""
procmon is a little utility for monitoring whether a process is running or not. If it's not, it'll send a notification.
"""
import argparse
import os.path
import sys

from src.logger import log, set_log_level
from src.mail import send_email, build_email_message
from src import process, config

VERSION = '0.2.1'


def main(args):
    set_log_level(args.log_level)

    match_count = 0
    for proc in process.list_processes():
        if process.match(proc, args.filter, args.insensitive):
            match_count += 1

    if match_count < args.expected_matches:
        log.error(f'Found %d of expected %d processes' % (match_count, args.expected_matches))

        if args.send_email:
            send_email(build_email_message(args.filter, args.insensitive, match_count, args.expected_matches))

        sys.exit(1)

    log.info(f'Found %d of expected %d processes' % (match_count, args.expected_matches))
    sys.exit(0)


def print_version():
    """ Print version information """
    print(f'{os.path.basename(sys.argv[0])} {VERSION}')


if __name__ == '__main__':
    parser = argparse.ArgumentParser(add_help=True)
    parser.add_argument('-c', '--config', nargs=1, default=None,
                        help='Path for configuration file (default: /etc/procmon.cfg, ./procmon.cfg)')
    parser.add_argument('-e', '--expected-matches', type=int, default=1,
                        help='Number of matches required for a successful result')
    parser.add_argument('-i', '--insensitive', action='store_true',
                        help='Case insensitive process matching')
    parser.add_argument('--send-email', action='store_true',
                        help='Send email notification')
    parser.add_argument('--log-level', type=str, default='info', action='store',
                        help='Log level; debug, info, warning, error')
    parser.add_argument('--version', action='store_true',
                        help='Print the procmon version number')
    parser.add_argument('filter', type=str, nargs='?',
                        help='Filter string to match processes for')

    parsed_args = parser.parse_args()

    if parsed_args.version:
        print_version()
        sys.exit(0)

    if not parsed_args.filter:
        print('Missing filter string!')
        parser.print_help()
        sys.exit(2)

    config.read(parsed_args.config)

    main(parsed_args)
