#! /bin/zsh -fue

FORMAT=png
keep_graph_file=no

usage()
{
    setopt POSIX_ARGZERO
    cat <<EOF
usage: ${0##*/} [+-kpj] [-F format] [--] {file}
-h help
-d debug/trace
-p PNG
-P ps
-f pdf
-F format
-H html
***
Given a file prepared for tsort(1),
invoke dot(1) on it.
That means conversion + some header configuration.
EOF
}

invoke_xdot=no
extension=""

while getopts :dkHpPfF:x OPT; do
    case $OPT in
        h)
            usage
            exit 0
            ;;
        H)
            FORMAT=html
            extension=.html
            ;;
        k|+k)
            keep_graph_file=yes
            ;;
        x)
            invoke_xdot=yes
            ;;
        p|+p)
            FORMAT=png
            extension=png
            ;;
        P)
            FORMAT=ps
            extension=ps
            ;;
        f)
            FORMAT=pdf
            extension=pdf
            ;;
        F)
            FORMAT=$OPTARG
            ;;
        d)
            set -x
            ;;
        *)
            usage
            exit 2
    esac
done
shift OPTIND-1
OPTIND=1

temp=$(mktemp --tmpdir --suffix=.dot graph.XXX$extension)


if [[ $FORMAT = html ]]
then
    cat >> $temp <<EOF
<!DOCTYPE html>
<meta charset="utf-8">
<body>
  <script src="http://d3js.org/d3.v4.min.js"></script>
  <script src="http://viz-js.com/bower_components/viz.js/viz-lite.js"></script>
  <script src="https://github.com/magjac/d3-graphviz/releases/download/v0.1.2/d3-graphviz.min.js"></script>
  <div id="graph" style="text-align: center;"></div>
  <script>
    d3.select("#graph").graphviz()
    .renderDot('digraph  {\\
EOF
else
    cat >> $temp <<EOF
digraph {
fontsize=24;
EOF
fi
# size=\"64,48\";

# either from stdin or a file

if [ $# = 1 ]
then
    if [[ $FORMAT = html ]]; then
        sed -e 's/$/\\/;' $1 >> $temp
    else
        cat $1 >> $temp
    fi
elif [ $# = 0 ]; then
    if [[ $FORMAT = html ]]; then
        sed -e 's/$/\\/;'  >> $temp
    else
        cat >> $temp
    fi
else
    usage >&2
    exit 1
fi

{
    if [[ $FORMAT = html ]]; then
        cat <<EOF
}');
  </script>

<ol>
  <li><a href="https://github.com/d3/d3">D3: Data-Driven Documents</a>
  <li><a href="https://github.com/mstefaniuk/graph-viz-d3-js">Graphviz dot in your browser (bower)</a>
  <li><a href="https://github.com/magjac/d3-graphviz">d3-graphviz (used here)</a>
</ol>

</body>
EOF
    else
        echo "}"
    fi
} >> $temp


echo "graph in file: $temp" >&2


if [[ $invoke_xdot = yes ]]; then
    (set -x; xdot ${XDOT_PARAMS-} $temp)
else
    (set -x
     dot -T$FORMAT $temp
    )
fi


if [ $keep_graph_file = yes ];then
    echo "dot file $temp" >&2
else
    rm -f $temp
fi

#dot -Nshape=box  /tmp/file.dot > /tmp/file.jpeg
