#!/usr/bin/env python

# ---
# weinre is available under *either* the terms of the modified BSD license *or* the
# MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
# 
# Copyright (c) 2010, 2011 IBM Corporation
# ---

import os
import re
import sys
import json
import optparse

#--------------------------------------------------------------------
def main():
    
    #----------------------------------------------------------------
    if len(sys.argv) < 4:
        error("expecting parameters piecesHtmlFile srcDir outputDir")
    
    iFileName   = sys.argv[1]
    srcDirName  = sys.argv[2]
    oDirName    = sys.argv[3]
    
    if not os.path.exists(iFileName):   error("input file not found: '" + iFileName + "'")
    if not os.path.exists(srcDirName):  error("source directory not found: '" + srcDirName + "'")
    if not os.path.isdir(srcDirName):   error("source directory not a directory: '" + srcDirName + "'")
    if not os.path.exists(oDirName):    error("output directory not found: '" + oDirName + "'")
    if not os.path.isdir(oDirName):     error("output directory not a directory: '" + oDirName + "'")
    
    #----------------------------------------------------------------
    with open(iFileName, "r") as iFile:
        lines = iFile.readlines()
        
    #----------------------------------------------------------------
    scripts     = []
    scriptNames = {}
    scriptSrc   = {}
    scriptMin   = {}
    scriptSrcPattern = re.compile(r'.*?<script\s+src\s*=\s*"/(.*?)"\s*>\s*</script>.*')
    
    for line in lines:
        match = scriptSrcPattern.match(line)
        if not match: continue
        
        baseScriptFile = match.group(1)
        scriptFile = os.path.join(srcDirName, baseScriptFile)
        if scriptFile == "weinre-demo.js": continue
        if not os.path.exists(scriptFile):   error("script file not found: '" + scriptFile + "'")
        
        scripts.append(scriptFile)
        scriptNames[scriptFile] = baseScriptFile

        with open(scriptFile, "r") as iFile:
            scriptSrc[scriptFile] = iFile.read()
            
        scriptMin[scriptFile] = min(scriptSrc[scriptFile])

        # log("read: %s" % scriptFile)

    #----------------------------------------------------------------
    oFileName = os.path.join(oDirName, "target-script.js")
    writeMergedFile(oFileName, scripts, scriptNames, scriptSrc)

    #----------------------------------------------------------------
    oFileName = os.path.join(oDirName, "target-script-min.js")
    writeMergedFile(oFileName, scripts, scriptNames, scriptMin)

#--------------------------------------------------------------------
def writeMergedFile(oFileName, scripts, scriptNames, srcs):

    lines = []
    lines.append(";(function(){")
    
    for script in scripts:
        lines.append("//==================================================")
        lines.append("// file: " + scriptNames[script])
        lines.append("//==================================================")
        lines.append(srcs[script])
        lines.append(";")
        lines.append("")

    lines.append("require('weinre/target/Target').getClass().main()")
    lines.append("})();")
    targetScript = "\n".join(lines)
    
    with open(oFileName, "w") as oFile:
        oFile.write(targetScript)
    
    log("generated: %s" % oFileName)

#--------------------------------------------------------------------
def min(script):
    patternCommentC   = re.compile(r"/\*.*?\*/",     re.MULTILINE + re.DOTALL)
    patternCommentCPP = re.compile(r"(?<!\\)//.*?$", re.MULTILINE)
    patternIndent     = re.compile(r"^\s*",          re.MULTILINE)
    patternBlankLine  = re.compile(r"^\s*\n",        re.MULTILINE)

    script = patternCommentC.sub(   "", script)
    script = patternCommentCPP.sub( "", script)
    script = patternIndent.sub(     "", script)
    script = patternBlankLine.sub(  "", script)
    
    return script

#--------------------------------------------------------------------
def log(message):
    message = "%s: %s" % (PROGRAM_NAME, message)
    print >>sys.stderr, message

#--------------------------------------------------------------------
def error(message):
    log(message)
    sys.exit(-1)

#--------------------------------------------------------------------
PROGRAM_NAME = os.path.basename(sys.argv[0])

main()
