#!/usr/bin/ruby

def make_header(lines)
    from_header = lines.detect { |line| line =~ /^From: / }
    date_header = lines.detect { |line| line =~ /^Date: / }
    if /<(.*)>/.match(from_header)
        sender = $1
    else
        sender = /From: (.*)/.match(from_header)[1]
    end
    dummy, weekday, day, month, year, time = /^Date: (...), ([0-9]*) (...) (....) (........)/.match(date_header).to_a
    if day.length == 1 then day = " " + day end
    "From " + sender + " " + weekday + " " + month + " " + day + " " + time + " " + year
end

def dump_multipart(basename, boundary)
    part = 1
    while Dir.entries(".").member?(basename + part.to_s + ".MIME")
        lines = open(basename + part.to_s + ".MIME").readlines
        puts "--" + boundary
        puts escape(lines)
        if Dir.entries(".").member?(basename + part.to_s)
            puts escape(open(basename + part.to_s).readlines)
        end
        if Dir.entries(".").member?(basename + part.to_s + ".1")
            dump_multipart(basename + part.to_s + ".", detect_boundary(lines))
        end
        part += 1
    end
end

def detect_boundary(lines)
    boundary_header = lines.detect { |line| line =~ /boundary/ }
    return $1 if /"(.*)"/.match(boundary_header)
end

def escape(lines)
    result = []
    lines.each do |line|
        if line =~ /^>*From / then line = ">" + line end
        result.push line
    end
    return result
end

files = Dir.entries(".").find_all { |file| file =~ /^[0-9]+\.$/ }
for filename in files
    lines = open(filename).readlines
    puts make_header(lines)
    puts escape(lines)
    puts
end

files = Dir.entries(".").find_all { |file| file =~ /^[0-9]+\.HEADER$/ }
for filename in files
    lines = open(filename).readlines
    puts make_header(lines)
    puts escape(lines)
    boundary = detect_boundary(lines)
    if boundary
        dump_multipart(/([0-9]+\.)/.match(filename)[1], boundary)
    else
        puts
    end
end