#!/usr/bin/env python

import tempfile, sys, os, string

if len(sys.argv) < 3:
    print 'Syntax:  mapil-mbox filename msgnum [mapil options]'
    sys.exit(1)

try: f = open(sys.argv[1])
except os.error:
    print 'Error opening file '+sys.argv[1]
    sys.exit(2)

try:
    num = string.atoi(sys.argv[2])
    if num < 1: raise ValueError
except (ValueError, TypeError):
    print 'Second argument must be a positive integer'
    sys.exit(3)

fnout = tempfile.mktemp()
try: fout = open(fnout, 'w')
except os.error:
    print 'Unable to open '+fnout+' for writing'
    sys.exit(4)

def Cleanup():
    f.close()
    fout.close()
    try: os.remove(fnout)
    except os.error: pass

# Write given mailbox file to outfile until correct message found.
count = 0
prevline = '\n'
while 1:
    line = f.readline()
    if not line:
	print 'Mailbox ' + sys.argv[1] + ' only has ' + str(count) + \
	      ' messages in it'
	Cleanup()
	sys.exit(5)
    if line[:5] == 'From ' and prevline == '\n':
	count = count + 1
	if count == num:
	    break
    fout.write(line)
    prevline = line

# Save current message to tempfile
fnmsg = tempfile.mktemp()
try: fmsg = open(fnmsg, 'w')
except os.error:
    print 'Unable to open tempfile '+fnmsg+' for writing'
    Cleanup()
    sys.exit(6)

prevline = line
while 1:
    line = f.readline()
    if not line or (line[:5] == 'From ' and prevline == '\n'):
	break
    fmsg.write(prevline)
    prevline = line
fmsg.close()
os.system('cp '+fnmsg+' /home/ben/prog/python/mapil/sample/fnmsg')

# Now run mapil on tempfile
os.system(string.join(['mapil'] + sys.argv[3:] + [fnmsg]))

# Write new output file into mailbox, add extra newline
fmsg = open(fnmsg)
fout.write(fmsg.read())
fmsg.close()
#os.remove(fnmsg)
fout.write('\n')

# Copy rest of mbox into outfile
if line:
    fout.write(line)
    fout.write(f.read())
f.close()
fout.close()

try: os.rename(sys.argv[1], sys.argv[1]+'~')
except os.error:
    print 'Unable to rename '+sys.argv[1]+' to backup file ' + \
	  sys.argv[1] + '~'
    print 'Leaving input in '+sys.argv[1]+' and output mbox in '+fnout
    sys.exit(7)

try: os.rename(fnout, sys.argv[1])
except os.error:
    try: f = open(sys.argv[1], 'w')
    except os.error:
	print 'Unable to open '+sys.argv[1]+' for writing'
	print 'Leaving input in '+sys.argv[1]+' and output mbox in '+fnout
	os.rename(sys.argv[1]+'~', sys.argv[1])
	sys.exit(8)
    fout = open(fnout)
    f.write(fout.read())
    f.close()
    fout.close()
