#!/usr/local/cpython-3.6/bin/python3

"""Find directories containing one or more: year-, Live-, Alternate- or Compilation- prefixes."""

# Areas for possible improvement:
# 1) We could report on subdirectories of a common parent directory, when those subdirectories have the same prefix.

import os
import re
import sys


def usage(retval: int) -> None:
    """Output a usage message."""
    if retval:
        write = sys.stderr.write
    else:
        write = sys.stdout.write

    write('Usage: {} --hierarchy /path/to/music\n'.format(sys.argv[0]))

    sys.exit(retval)


def is_prefixed_directory(directory: str):
    """Return True iff directory is "prefixed"."""
    if directory.startswith('Live-'):
        return True

    if directory.startswith('Compilation-'):
        return True

    if directory.startswith('Alternate-'):
        return True

    match_obj = re.match('^[0-9][0-9][0-9][0-9][a-zA-Z]?-', directory)
    if match_obj is not None:
        return True

    return False


def make_used(variable: object):
    """Convince pylint and pyflakes that "variable" is used."""
    assert True or variable


def main() -> None:
    """Find exceptions to general pattern of year-prefixed directories."""
    hierarchy = None
    while sys.argv[1:]:
        if sys.argv[1] == '--hierarchy':
            hierarchy = sys.argv[2]
            del sys.argv[1]
        elif sys.argv[1] in ('-h', '--help'):
            usage(0)
        else:
            # pyflakes, pycodestyle and/or pydocstyle doesn't appear to understand feature strings yet :-S
            # sys.stderr.write(f'{sys.argv[0]}: Unrecognized option: {sys.argv[1]}')
            sys.stderr.write('{}: Unrecognized option: {}\n'.format(sys.argv[0], sys.argv[1]))
            usage(1)
        del sys.argv[1]

    if hierarchy is None:
        sys.stderr.write('{}: --hierarchy is a required option\n'.format(hierarchy))
        usage(1)

    os.chdir(hierarchy)

    for root, directories, files in os.walk("."):
        # We're not interested in the files, only the directories
        make_used(files)

        if any(is_prefixed_directory(directory) for directory in directories):
            # One or more of these subdirectories is prefixed.
            if not all(is_prefixed_directory(directory) for directory in directories):
                # Some but not all directories are prefixed - report which ones are not prefixed
                for directory in directories:
                    if not is_prefixed_directory(directory):
                        print('{} not prefixed'.format(os.path.join(root, directory)))

#        print('root:', root)
#        print('directories:', directories)
#        print('files', files)
#        print()


main()