#!/usr/bin/env python3

import argparse
import os
import pathlib
import subprocess
import sys

import yaml

try:
    _data_home = os.environ['XDG_DATA_HOME']
except KeyError:
    _data_home = pathlib.Path(os.path.expanduser('~'), '.local', 'share')
SHARE_DIR = pathlib.Path(_data_home, 'rt-auto-remind')
SHARE_DIR.mkdir(parents=True, exist_ok=True)

class Reminder:
    def __init__(self, key, min_days, max_days, search,
                 date_field='Due', body_file=None, action='correspond'):
        if body_file is None:
            body_file = pathlib.Path(SHARE_DIR, 'templates', key + '.txt')
        self.key = key
        self.min_days_diff = int(min_days)
        self.max_days_diff = int(max_days)
        self.search = search
        self.date_field = date_field
        self.body_file = body_file
        self.action = action

    def remind_cmd(self):
        return [
            'rt-auto-remind', '--{}'.format(self.action),
            '--key', self.key,
            self.date_field,
            str(self.min_days_diff),
            str(self.max_days_diff),
            self.search,
            str(self.body_file),
        ]


def parse_arguments(arglist):
    parser = argparse.ArgumentParser()
    parser.add_argument(
        'yaml_files', metavar='PATH',
        type=pathlib.Path,
        nargs='+',
        help="YAML file(s) with configuration of reminders to send out",
    )
    return parser.parse_args(arglist)

def main(arglist=None, stdout=sys.stdout, stderr=sys.stderr):
    args = parse_arguments(arglist)
    failures = 0
    for yaml_path in args.yaml_files:
        with yaml_path.open() as yaml_file:
            yaml_data = yaml.safe_load(yaml_file)
        for key in yaml_data:
            reminder = Reminder(key, **yaml_data[key])
            try:
                subprocess.run(reminder.remind_cmd(), check=True)
            except subprocess.CalledProcessError as error:
                print("warning: reminder {} exited {}".format(key, error.returncode))
                failures += 1
    if failures == 0:
        return 0
    else:
        return min(10 + failures, 99)

if __name__ == '__main__':
    exit(main())