#!/usr/bin/env python
# Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
# for details. All rights reserved. Use of this source code is governed by a
# BSD-style license that can be found in the LICENSE file.

# This script builds and then uploads the Dart client sample app to AppEngine,
# where it is accessible by visiting http://dart.googleplex.com.
import os
import subprocess
import sys

from os.path import abspath, basename, dirname, exists, join, split, relpath
import base64, re, os, shutil, subprocess, sys, tempfile, optparse

APP_PATH = os.getcwd()
CLIENT_TOOLS_PATH = dirname(abspath(__file__))
CLIENT_PATH = dirname(CLIENT_TOOLS_PATH)

# Add the client tools directory so we can find htmlconverter.py.
sys.path.append(CLIENT_TOOLS_PATH)
import htmlconverter


def convertOne(infile, options):
    outDirBase = 'outcode'
    outfile = join(outDirBase, infile)
    print 'converting %s to %s' % (infile, outfile)

    if 'dart' in options.target:
        htmlconverter.convertForDartium(infile, outDirBase,
                                        outfile.replace('.html', '-dart.html'),
                                        options.verbose)
    if 'js' in options.target:
        htmlconverter.convertForChromium(infile, options.dartc_extra_flags,
                                         outfile.replace('.html', '-js.html'),
                                         options.verbose)


def Flags():
    """ Consturcts a parser for extracting flags from the command line. """
    result = optparse.OptionParser()
    result.add_option(
        "-t",
        "--target",
        help="The target html to generate",
        metavar="[js,dart]",
        default='js,dart')
    result.add_option(
        "--verbose",
        help="Print verbose output",
        default=False,
        action="store_true")
    result.add_option(
        "--dartc_extra_flags",
        help="Additional flag text to pass to dartc",
        default="",
        action="store")
    #result.set_usage("update.py input.html -o OUTDIR -t chromium,dartium")
    return result


def getAllHtmlFiles():
    htmlFiles = []
    for filename in os.listdir(APP_PATH):
        fName, fExt = os.path.splitext(filename)
        if fExt.lower() == '.html':
            htmlFiles.append(filename)

    return htmlFiles


def main():
    os.chdir(CLIENT_PATH)  # TODO(jimhug): I don't like chdir's in scripts...

    parser = Flags()
    options, args = parser.parse_args()
    #if len(args) < 1 or not options.out or not options.target:
    #  parser.print_help()
    #  return 1

    REL_APP_PATH = relpath(APP_PATH)
    for file in getAllHtmlFiles():
        infile = join(REL_APP_PATH, file)
        convertOne(infile, options)


if __name__ == '__main__':
    main()
