#!/bin/sh

puts() 
{
  printf "\033[1m\033[38;5;%sm[%s]\033[m %s\n" "$3" "$1" "$2"
}

error()
{
  puts "ERROR" "$1" "9"

  if [ -n "$2" ]
  then
    exit "$2"
  else
    exit 1
  fi
}

message()
{
  puts "TIKZTOSVG" "$1" "2"
}

showHelp()
{
  man tikztosvg
  exit 0
}

showVersion()
{
  echo 0.1.2
  exit 0
}

if ! [ -x "$(command -v xelatex)" ]
then
  error "xelatex could not be found"
fi

if ! [ -x "$(command -v pdf2svg)" ]
then
  error "pdf2svg could not be found"
fi

# Parsing the arguments
PACKAGES=""
while [ $# -gt 1 ]
do
  case "$1" in
    -h|--help)
      showHelp
      ;;
    -v|--version)
      showVersion
      ;;
    -p|--package)
      case "$2" in
        "")
          error "Unnexpected EOF"
          ;;
        # Check if the name of the package is valid
        *" "*) 
          error "Invalid package name. LaTeX package names cannot contain scapes!" 
          ;;
        *)
          PACKAGES="$PACKAGES $2"
          shift
          shift
      esac
      ;;
    -o|--output)
      if [ -n "$OUTPUT" ]
      then
        error "The output path was specified multiple times"
      elif [ -z "$2" ]
      then
        error "Unexpected EOF"
      else
        OUTPUT="$2"
        shift
        shift
      fi
      ;;
    -q|--quit)
      QUIET=1
      shift
      ;;
    *) 
      error "Unexpected token: \"$1\""
      ;;
  esac
done

case "$1" in
  -h|--help)
    showHelp
    ;;
  -v|--version)
    showVersion
    ;;
  "")
    error "No input path provided"
    ;;
  "-")
    INPUT=/dev/stdin
    ;;
  *)
    INPUT="$1"
    ;;
esac

case "$OUTPUT" in
  # Set the output to stdout
  -)
    QUIET=1
    OUTPUT=/dev/stdout
    ;;

  # If no output path is provided, use the basename of the input
  "") 
    if [ -x "$(command -v dirname)" ]
    then
      OUTPUT="$(dirname "$INPUT")/$(basename "$INPUT" | cut -d "." -f1).svg" 
    fi
    ;;

  # If the output path is provided, but it resolves to directory, output a 
  # a file with the same basename as the input in the target directory
  */) 
    OUTPUT="$OUTPUT$(basename "$INPUT" | cut -d "." -f1).svg" 
    ;;
esac

TEMP_DIR="$(mktemp -d)"
TEX_FILE="$TEMP_DIR/tmp.tex"

# Generate the LaTeX document
printf "\documentclass[crop,tikz,multi=false]{standalone}\n" > "$TEX_FILE"

for PACKAGE in $PACKAGES
do
  printf "\usepackage{%s}\n" "$PACKAGE" >> "$TEX_FILE"
done

printf "\\\begin{document} \huge\n" >> "$TEX_FILE"
cat "$INPUT" >> "$TEX_FILE"

if [ $? -ne 0 ]
then
  rm "$TEMP_DIR" -r
  error "File not found: $INPUT"
fi

printf "\\\end{document}\n" >> "$TEX_FILE"

if [ -z "$QUIET" ]
then
  message "Rendering the LaTeX document. . ."
  xelatex -halt-on-error -output-directory="$TEMP_DIR" "$TEX_FILE"
else
  xelatex -halt-on-error -output-directory="$TEMP_DIR" "$TEX_FILE" 1> /dev/null 2>&1
fi

S=$?
if [ $S -ne 0 ]
then
  rm "$TEMP_DIR" -r
  if [ -z "$QUIET" ]
  then
    error "xelatex exited with code $S" $S
  else
    exit $S
  fi
fi

if [ -z "$QUIET" ]
then
  message "Converting the output to SVG. . ."
fi

pdf2svg "$TEMP_DIR/tmp.pdf" "$OUTPUT" 1

S=$?
if [ $S -ne 0 ]
then
  rm "$TEMP_DIR" -r
  if [ -z "$QUIET" ]
  then
    error "pdf2svg exited with code $S" $S
  else
    exit $S
  fi
fi

if [ -z "$QUIET" ]
then
  message "Done!"
fi

rm "$TEMP_DIR" -rf

