#!/usr/bin/python

import imaplib
import email
import re
import sys

from github3 import login
from github3 import pulls
from github3 import issues

mail = imaplib.IMAP4_SSL('imap.yandex.ru')
mail.login('imap-login@domain.com', 'imap-password')
mail.list()
# Out: list of "folders" aka labels in gmail.
mail.select("inbox") # connect to inbox.

pull_rq_db = {}

gh = login('github-login@domai.com', password='github-password')
me = gh.user()
print me

repo = gh.repository(me, "Linaro\/odp")
print repo

for r in gh.iter_repos():
	print r.full_name
	print r.name
	if r.full_name == "Linaro/odp":
		repo = r
		break

if not repo:
	exit(1)

print "Using github repo %s" % r.full_name

# get new messages

def is_patch(msg):
	m = re.search("\nSubject.*Re:.*PATCH.*\n", msg)
	if m:
		#print m.group(0)
		return 1
	return 0

def get_find_pull_req(msg):
	m = re.search(r'https://github.com/Linaro/odp/pull/.*\n', msg)
	if m:
		return m.group(0)[35:]
	return ""

def process_email(i, efrom, msg, pr):
	#f = open("eml/em-%d.dat" % i, "w")
	#f.write(msg)
	#f.close()

	#for ic in pr.iter_issue_comments():
	#	print ic
	issue = repo.issue(pr.number)

	pre_msg = "<pre>From: %s\n %s </pre>" % (efrom, msg)
	issue.create_comment(pre_msg)

	return

def get_all_prs():
	mail.select(readonly=1) # Select inbox or default namespace
	(retcode, messages) = mail.search(None, '(SEEN)')

	for num in messages[0].split():
		typ, data = mail.fetch(num,'(RFC822)')
		msg_str = email.message_from_string(data[0][1])
		msg = str(msg_str)
		pr = get_find_pull_req(msg)
		if pr != "":
			pull_rq_db[msg_str['Message-ID']] = pr
			print pr,
			sys.stdout.flush()
	return


get_all_prs()

mail.select(readonly=0) # Select inbox or default namespace
(retcode, messages) = mail.search(None, '(UNSEEN)')
#(retcode, messages) = mail.search(None, '(SEEN)')

print retcode
print messages

if retcode != 'OK':
	exit (1)

i = 0
for num in messages[0].split():
	typ, data = mail.fetch(num,'(RFC822)')

	msg_str = email.message_from_string(data[0][1])
	msg = str(msg_str)

	if not is_patch(msg):
		continue

	if msg_str.is_multipart():
		continue

	#print "Message-ID=", msg_str['Message-ID']
	#print "In-Reply-To=", msg_str['In-Reply-To']
	#print "Pull request =", pr

	if not 'In-Reply-To' in msg_str:
		print "x",
		sys.stdout.flush()
		i = i + 1
		continue

	pr = get_find_pull_req(msg)
	if pr != "":
		pull_rq_db[msg_str['Message-ID']] = pr
	else:
		if msg_str['In-Reply-To'] in pull_rq_db:
			pr = pull_rq_db[msg_str['In-Reply-To']]
			print "Found pr from in replay"
	if pr == "":
		print ".",
		sys.stdout.flush()
		i = i + 1
		continue

	efrom = msg_str['From']
    	body = msg_str.get_payload(decode=True)

	print "Message-ID=", msg_str['Message-ID']
	print "In-Reply-To=", msg_str['In-Reply-To']
	print "Pull request =", pr

	mail.store(num, '+FLAGS', '\\SEEN')
	process_email(i, efrom, body, repo.pull_request(pr))

	f = open("eml/em-%d.eml" % i, "w")
	f.write(msg)
	f.close()

	i = i + 1

