# a module to help with handling of filenames, directory trees, etc.

import os
import os.path
import stat

def pathsubtract(a, b):
    index = a.find(b)
    if index == -1:
        return None
    res = a[ (index + len(b)): ]

    if res.find("/") == 0:
        res = res[1:]
    return res

# same as C strcmp()
def strcmp(a, b):
    if a < b:
        return -1
    if a > b:
        return 1
    return 0

class TreeNode:

    # path is the location of the file/directory. It is either a full path or
    # a path relative to $PWD
    def __init__(self, parent, path=".", root=".", isofile=None):
        if isofile:
            self.root = os.path.abspath(isofile)
            self.path = ""
        else:
            fullpath = os.path.abspath( path )
            fullroot = os.path.abspath( root )
            self.root = fullroot
            self.path = pathsubtract( fullpath, fullroot )
        self.parent = parent
        self.children = []

        if self.path == None:
            raise NameError, "Invalid paths %s and %s" % (fullpath, fullroot)

    # if this is a directory, add its children recursively
    def addchildren(self):
        if not stat.S_ISDIR( os.lstat(self.root + "/" + self.path).st_mode ):
            return

        children = os.listdir( self.root + "/" + self.path )
        for child in children:
            if self.path:
                child = self.path + "/" + child
            self.children.append( TreeNode(self, child, self.root) )
        for child in self.children:
            child.addchildren()

    def printAll(self, spaces=0):
        print " "*spaces + self.root + "/" + self.path
        for child in self.children:
            child.printAll(spaces + 2)

    def isValidISO1(self):
        pass

class Tree:
    def __init__(self, root=None, isofile=None):
        if isofile:
            self.root = TreeNode(parent=None, isofile=isofile)
        else:
            self.root = TreeNode(parent=None, path=root, root=root)
            self.root.addchildren()

    def isValidISO1(self):
        return root.isValidISO1();

#t = Tree(root=".")
#t.root.printAll()