#!/usr/bin/python3

import re
import os
import sys
import mailbox
import requests

try:
	spam_name = sys.argv[1]
except IndexError:
	spam_name = os.path.expanduser('~/spam.mbox')
if os.path.isdir(spam_name):
	spam = mailbox.Maildir(spam_name)
else:
	spam = mailbox.mbox(spam_name)
path = os.path.expanduser('~/www/drafts/debian-lists-spam-messages')
old_msgids = set()
try:
	with open(path) as f:
		old_msgids |= set(f.read().splitlines())
except FileNotFoundError:
	pass
msgids = set()
for i in range(len(spam)):
	msg = from_addr = subject = msgid = listid = None
	try:
		msg = spam[i]
		from_addr = msg.get('From')
		subject = msg.get('Subject')
		msgid = msg.get('Message-ID')
		listid = msg.get('List-Id')
		if msgid and listid and listid.find('lists.debian.org') != -1:
			msgids.add(msgid)
	except Exception as e:
		print('Broken message:', e, subject, from_addr, msgid, listid)
msgids -= old_msgids
msgids = {msgid for msgid in msgids if re.match(r'^\s*(<?[-\w\d\.%@]+>?).*\s*$', msgid)}
msgparams = dict([(msgid, { 'Quiet': 'on', 'msgid': msgid }) for msgid in msgids])
responses = dict([(msgid, requests.get('https://lists.debian.org/cgi-bin/nominate-for-review.pl', params=params)) for msgid, params in msgparams.items()])
failures = dict([(msgid, response.text.strip()) for msgid, response in responses.items() if not response.text.startswith('OK: nominated ')])
if msgparams:
	msgids -= failures.keys()
	msgids |= old_msgids
	msgids = sorted(msgids)
	with open(path, 'w') as f:
		f.write('\n'.join(msgids))
if failures:
	error = 'Error nominating some messages:\n'
	print('\n'.join([' '.join(i) for i in failures.items()]))
	sys.exit(1)
