#!/usr/bin/python3

import argparse
import louis
import os
import re
import subprocess
import sys

### Functions ###
def fatal_error (message='', exitcode=1):
    print("Fatal error: %s" %(message));
    sys.exit(exitcode)

def trace(message, verbosity=1):
    if verbosity <= args.verbosity:
        print(message)

### MAIN ###
self=os.path.basename(sys.argv[0])

parser = argparse.ArgumentParser()
parser.add_argument('-v','--verbosity',
    type=int,
    help="Verbosity level, default 0.",
    default = 0)
parser.add_argument('-i','--infile',
    help="Input file name, default none.",
    default =None)
parser.add_argument('-o','--outfile',
    help="Output file name, default is generated from input text.",
    default = None)
parser.add_argument('-t','--text',
    help="Text string to process.",
    default = None)
parser.add_argument('-T','--table',
    help="Braille translation table to use, default 'en-us-g2.ctb'",
    default ='en-us-g2.ctb')
args = parser.parse_args()

lines = []
if args.text:
    lines.append(args.text)

if args.infile:
    if not os.path.exists(args.infile):
        fatal_error("File '%s' does not exist." %(args.infile))
    trace("Processing file '%s'." %(args.infile))
    handle = open(args.infile, 'r')
    for idx, line in enumerate(handle.readlines()):
        line_ = line.strip()
        trace("    Line %d: %s" %(idx + 1, line_))
        lines.append(line_)
    handle.close()

if not lines:
    fatal_error("Nothing to do. Please specify either --infile or --text to process.")

# Translate input text into lines of braille and combine them into an Openscad command line arg.
trace ("Converting to ascii braille using translation table, %s." %(args.table))
for idx, line in enumerate(lines):
    translations= louis.translate([args.table], line)
    trace (    "Line %d: '%s'" %(idx + 1, translations[0]))
    lines[idx]= translations[0]
strLines = "lines=[\"%s\"]" %(str.join("\",\"", lines))

# Generate an output file name if necessary.
if args.outfile:
    outfile = args.outfile
else:
    outfile = "%s.stl" %(re.sub(r'[\W_]+', '', str.title(lines[0])))
print("Creating file %s." %(outfile))

# Run Openscad to generate a stl 3D printer file.
trace("Running Openscad ...")
subprocess.run(["openscad", "braille.scad", "-D", "debug=%d" %(args.verbosity), "-D", strLines, "-o", outfile])
if os.path.exists(outfile):
    print("Success!");
else:
    print("Failure!");
# EOF

