#!/usr/bin/env python
# -*- coding: utf-8 -*-
#--------------------------------------------------------------------------------

##
## Copyright (c) 2005-2011 Gemini Mobile Technologies, Inc.  All rights reserved.
##
## Licensed under the Apache License, Version 2.0 (the "License");
## you may not use this file except in compliance with the License.
## You may obtain a copy of the License at
##
##     http:##www.apache.org/licenses/LICENSE-2.0
##
## Unless required by applicable law or agreed to in writing, software
## distributed under the License is distributed on an "AS IS" BASIS,
## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
## See the License for the specific language governing permissions and
## limitations under the License.
##

import os, sys
import re

opt_d = 0
def dprint(msg):
    global opt_d
    if opt_d > 0:
        print(msg)

def get_file(filename, basedir=None):
    if basedir == None:
        basedir = "./"
    f = open(os.path.join(basedir, filename))
    data = f.read()
    f.close()
    dprint("get_file: filename=%r --> data=<%s>" % (filename, data))
    return data

def put_file(filename, data, basedir=None):
    if basedir == None:
        basedir = "./"
    if not os.path.isdir(basedir):
        os.mkdir(basedir)
    f = open(os.path.join(basedir, filename), "wb")
    f.write(data)
    f.close()

def is_deps_file(filename):
    if os.path.isfile(filename):
        return True
    if filename.find('/images/') >= 0:
        base, ext = os.path.splitext(filename.replace('/images/', '/images-src/'))
        for ext in ('.msc', '.dot', '.dia'):
            if os.path.isfile(base + ext):
                return True
    return False


def find_deps(source, basedir=None, deps=None):
    incdef = {
        'include': [''],
        'image': [''],
        'svgimage': ['.svg', '.png'],
    }
    if deps == None:
        deps = []
    if basedir == None:
        basedir = "./"

    for incstr in incdef.keys():
        rest = source
        dprint("find_deps: rest=%r" % rest)
        while rest != "":
            m = re.search(r"\s%s::?([^[]+)\[[^]]*\]" % incstr, rest)
            if m == None:
                break
            for ext in incdef[incstr]:
                fn = basedir + m.group(1) + ext
                if is_deps_file(fn):
                    deps.append(fn)
                else:
                    print >>sys.stderr, "warning: file not found: %s" % fn

            rest = rest[m.end(0):]
            if incstr == 'include':
                fn = basedir + m.group(1)
                if is_deps_file(fn):
                    inc_source = get_file(m.group(1), basedir=basedir)
                    find_deps(inc_source, basedir=basedir, deps=deps)
                else:
                    print >>sys.stderr, "warning: file not found: %s" % fn

    return deps

if __name__ == '__main__':
    if len(sys.argv) >= 6:
        fname = sys.argv[1]
        depsext = sys.argv[2]
        depsdir = sys.argv[3]
        outdir = sys.argv[4]
        trgext = sys.argv[5:]
    else:
        fprint >>sys.stderr, "### USAGE: %s ADOCFILE DEPSEXT DEPSDIR OUTPUTDIR TARGETEXT..." % sys.argv[0]
        fprint >>sys.stderr, "   EXAMPLE: %s Test.adoc .P .deps public_html/ .html" % sys.argv[0]
        sys.exit(2)
    base, ext = os.path.splitext(fname)
    dprint("base=%r, ext=%r" % (base, ext))
    deps = find_deps(get_file(fname))
    dprint("len(sys.argv)=%r" % len(sys.argv))
    dprint("deps=%r" % deps)

    trgs = ""
    for ext in trgext:
        trgs += "%s%s%s " % (outdir, base, ext)
    depstr = "%s : \\\n" % trgs
    for fn in [os.path.join(depsdir, "%s%s" % (base, depsext)), fname] + deps:
        depstr += "\t%s \\\n" % fn
    depstr += "\n"

    put_file("%s%s" % (base, depsext), depstr, basedir=depsdir)

# END
