#!/usr/bin/env python

# This script extracts the VPlan digraphs from the vectoriser debug messages
# and saves them in individual dot files (one for each plan). Optionally, and
# providing 'dot' is installed, it can also render the dot into a PNG file.

from __future__ import print_function

import sys
import re
import argparse
import shutil
import subprocess

parser = argparse.ArgumentParser()
parser.add_argument('--png', action='store_true')
args = parser.parse_args()

dot = shutil.which('dot')
if args.png and not dot:
    raise RuntimeError("Can't export to PNG without 'dot' in the system")

pattern = re.compile(r"(digraph VPlan {.*?\n})",re.DOTALL)
matches = re.findall(pattern, sys.stdin.read())

for vplan in matches:
    m = re.search("graph \[.+(VF=.+,UF.+), ", vplan)
    if not m:
        raise ValueError("Can't get the right VPlan name")
    name = re.sub('[^a-zA-Z0-9]', '', m.group(1))

    if args.png:
        filename = 'VPlan' + name + '.png'
        print("Exporting " + name + " to PNG via dot: " + filename)
        p = subprocess.Popen([dot, '-Tpng', '-o', filename],
                              encoding='utf-8',
                              stdin=subprocess.PIPE,
                              stdout=subprocess.PIPE,
                              stderr=subprocess.PIPE)
        out, err = p.communicate(input=vplan)
        if err:
            raise RuntimeError("Error running dot: " + err)

    else:
        filename = 'VPlan' + name + '.dot'
        print("Exporting " + name + " to DOT: " + filename)
        with open(filename, 'w') as out:
            out.write(vplan)
