import os, sys

MIN_VERSION = [1, 0, 0]
MAX_VERSION = [2, 6, 0]

class Options:
    def __init__(self, argv):
        self.script_name = sys.argv[0]
        self.doc_fname = None
        self.dir = None
        
        self.parse(argv)
    
    def usage_text(self):
        """ Return usage message string. """
        txt = "Usage:\n"
        txt += "python %s doc_filename files_dir/" % self.script_name
        return txt
    
    def parse(self, argv):
        """ Read argv (as sys.argv) and set variables. """
        self.script_name, params = argv[0], argv[1:]

        i = 0
        while len(params):
            par, params = params[0], params[1:]
            if i == 0:
                self.doc_fname = par
            elif i == 1:
                self.dir = par
            i += 1
    
    def check(self):
        messages = []
        
        # Add checks here
        if self.doc_fname == None:
            messages.append("No document file name given.")
        if self.dir == None:
            messages.append("No directory name given.")

        message = '\n'.join(messages)
        ok = (len(messages) == 0)
        return ok, message

def check_python_version(min_ver, max_ver):
    """ min_ver, max_ver must be lists of integers: [2, 6, 0] """
    def ver_to_str(version):
        return '.'.join(map(str, version))

    ok = True
    message = ""
    version = map(int, sys.version.split()[0].split('.'))
    for ver_digit, min_digit, max_digit in zip(version, min_ver, max_ver):
        if ver_digit < min_digit or ver_digit > max_digit:
            ok = False
            message = "The script cannot run, because your version "
            message += "of Python (%s) is not supported.\n" % (ver_to_str(version))
            message += "It must be between %s and %s. Sorry.\n" % \
                       (ver_to_str(min_ver), ver_to_str(max_ver))
            message += "You can try to install and use a supported version of Python.\n"
            break
        elif ver_digit > min_digit:
            break
    return ok, message

def main(options):
    file = open(options.doc_fname, 'r')
    text = file.read()
    file.close()
    for fname in os.listdir(options.dir):
        sys.stdout.write("%40s  " % fname)
        if fname in text:
            print "referenced"
        else:
            if os.path.splitext(fname)[0] in text:
                print "referenced without extension"
            else:
                print "not referenced"
    print "Done."

if __name__ == "__main__":
    ok, message = check_python_version(MIN_VERSION, MAX_VERSION)
    if not ok:
        print message
        sys.exit(1)

    options = Options(sys.argv)
    ok, message = options.check()
    if not ok:
        print "Print list of files that are not mentioned in a file."
        print "Can be useful for cleaning a directory with unused images"
        print "in combination with a .tex file, for example."
        print message
        print options.usage_text()
        sys.exit(1)
    
    main(options)
