import os,sys, getopt,re

badlyNamedProperties = ["kOfxImageEffectFrameVarying", "kOfxImageEffectPluginRenderThreadSafety"]

def getPropertiesFromDir(sourcePath, recursive, props):

    if os.path.isdir(sourcePath):
        files=sorted(os.listdir(sourcePath))
        for f in files:
            absF = sourcePath + '/' + f
            if not recursive and os.path.isdir(absF):
                continue
            else:
                getPropertiesFromDir(absF,recursive,props)
    elif os.path.isfile(sourcePath):
        ext = os.path.splitext(sourcePath)[1]
        if ext.lower() in ('.c', '.cxx', '.cpp', '.h', '.hxx', '.hpp'):
            with open(sourcePath) as f:
                try:
                    lines = f.readlines()
                except UnicodeDecodeError as e:
                    print('WARNING: error in', sourcePath, ':')
                    raise e
                for l in lines:
                    # Detect lines that correspond to a property definition, e.g:
                    # #define kOfxPropLala "OfxPropLala"
                    splits=l.split(' ')
                    if len(splits) != 3:
                        continue
                    if splits[0] != '#define':
                        continue
                    if 'Prop' in splits[1] and splits[1] != 'kOfxPropertySuite':
                        #if l.startswith('#define kOfx') and 'Prop' in l:
                        props.append(splits[1])
    else:
        raise ValueError('No such file or directory: %s' % sourcePath)

def main(argv):

    recursive=False
    sourcePath=''
    outputFile=''
    try:
        opts, args = getopt.getopt(argv,"i:o:r",["sourcePath=","outputFile","recursive"])
        for opt,value in opts:
            if opt == "-i":
                sourcePath = value
            elif opt == "-o":
                outputFile = value
            elif opt == "-r":
                    recursive=True

    except getopt.GetoptError:
        sys.exit(1)

    props=badlyNamedProperties
    getPropertiesFromDir(sourcePath, recursive, props)

    re='/^#define k[\w_]*Ofx[\w_]*Prop/'
    with open(outputFile, 'w') as f:
        f.write('.. _propertiesReference:\n')
        f.write('Properties Reference\n')
        f.write('=====================\n')
        for p in props:
            f.write('.. doxygendefine:: ' + p + '\n\n')

if __name__ == "__main__":
    main(sys.argv[1:])
