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

import symuid


def symuid_list(path, path_ignore_regex, filter_expression, sort_expression, limit, prefix):
    # use generators until sort is required
    attr_it = ({'path': track.path,
                'comment': track.comment,
                'play_count': track.get_play_count_sum()}
               for track in symuid.Track.walk(path, path_ignore_regex))
    if filter_expression:
        attr_it = filter(lambda a: eval(filter_expression, a), attr_it)
    if sort_expression:
        attr_it = list(attr_it)
        attr_it.sort(key=lambda a: eval(sort_expression, a))
    for i, attr in enumerate(attr_it):
        if limit and i == limit:
            break
        print(prefix + attr['path'])


def _init_argparser():
    import argparse
    import re
    argparser = argparse.ArgumentParser(description=None)
    argparser.add_argument('path')
    argparser.add_argument(
        '--path-ignore-regex',
        default=symuid.Track.PATH_DEFAULT_IGNORE_REGEX,
        nargs=1,
        metavar='pattern',
        dest='path_ignore_regex',
        type=lambda pattern: re.compile(pattern),
        help='(default: %(default)s)',
    )
    argparser.add_argument(
        '--filter',
        metavar='expression',
        dest='filter_expression',
        help='(example: {!r} or {!r})'.format(
            "play_count > 16 and path.endswith('.mp3')",
            "comment is None or len(comment) < 16",
        ),
    )
    argparser.add_argument(
        '--sort',
        metavar='expression',
        dest='sort_expression',
        help='(example: {!r} or {!r})'.format(
            "play_count * -1",
            "(play_count, len(path))",
        ),
    )
    argparser.add_argument(
        '--limit',
        type=int,
        help='(default: none)',
    )
    argparser.add_argument(
        '--prefix',
        type=str,
        default='',
        help='add prefix to each resulting path (default: %(default)r)',
    )
    return argparser


def main(argv):
    argparser = _init_argparser()
    args = argparser.parse_args(argv[1:])
    symuid_list(**vars(args))
    return 0

if __name__ == "__main__":
    import sys
    sys.exit(main(sys.argv))