#!/usr/bin/env python3

import os
import re
import shutil
import subprocess
import sys
import time

from gds_to_lef_gds_mag import _magic_tcl_header, run_magic


def convert_to_svg(input_gds, input_techfile):
    input_gds = os.path.abspath(input_gds)
    input_techfile = os.path.abspath(input_techfile)

    destdir, gdsfile = os.path.split(input_gds)

    basename, ext = os.path.splitext(gdsfile)

    output_svg = os.path.join(destdir, "{}.svg".format(basename))
    assert not os.path.exists(output_svg), output_svg + " already exists!?"

    tcl_path = os.path.join(destdir, "{}.gds2svg.tcl".format(basename))
    with open(tcl_path, 'w') as ofile:
        _magic_tcl_header(ofile, input_gds)

        ofile.write("load " + basename + "\n")
        ofile.write("box 0 0 0 0\n")
        ofile.write("select top cell\n")
        ofile.write("expand\n")
        ofile.write("view\n")
        ofile.write("select clear\n")
        ofile.write("box position -1000 -1000\n")
        ofile.write("plot svg " + basename + ".tmp1.svg\n")
        ofile.write("quit -noprompt\n")

    output = run_magic(destdir, tcl_path, input_techfile, " XR")
    tmp1_svg = os.path.join(destdir, "{}.tmp1.svg".format(basename))
    tmp2_svg = os.path.join(destdir, "{}.tmp2.svg".format(basename))
    assert os.path.exists(tmp1_svg), tmp1_svg + " doesn't exist!?"
    os.unlink(tcl_path)

    for i in range(0, 3):
        # Remove the background
        with open(tmp1_svg) as f:
            data = f.read()
        data = re.sub('<rect[^>]* style="[^"]*fill-opacity:1;[^"]*"/>', '', data)
        with open(tmp2_svg, 'w') as f:
            f.write(data)

        # Use inkscape to crop
        retcode = run_inkscape([
            "--verb=FitCanvasToDrawing",
            "--verb=FileSave",
            "--verb=FileClose",
            "--verb=FileQuit",
            tmp2_svg])

        if retcode == 0:
            break

    for i in range(0, 3):
        # Convert back to plain SVG
        retcode = run_inkscape([
            "--export-plain-svg=%s" % (tmp2_svg),
            "--export-background-opacity=1.0",
            tmp2_svg])

        if retcode == 0:
            break

    os.unlink(tmp1_svg)

    # Move into the correct location
    os.rename(tmp2_svg, output_svg)
    print("Created", output_svg)

def run_inkscape(args):
    p = subprocess.Popen(["inkscape"] + args)

    try:
        p.wait(timeout=60)
    except subprocess.TimeoutExpired as e:
        print("ERROR: Inkscape timed out! Sending SIGTERM")
        p.terminate()
        try:
            p.wait(timeout=60)
        except subprocess.TimeoutExpired as e:
            print("ERROR: Inkscape timed out! Sending SIGKILL")
            p.kill()
        p.wait()

    return p.returncode

convert_to_svg(*sys.argv[1:])
