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

import re
import subprocess
import sys

import symuid


def generate_uuid():
    return subprocess.check_output(['uuid', '-v', '4', '-F', 'BIN']).strip()


def log_path(track_path, msg, stream=sys.stdout):
    stream.write("{!r}: {}\n".format(track_path, msg))


def log_path_error(track_path, msg):
    log_path(track_path, msg, stream=sys.stderr)


def symuid_sync(path, path_ignore_regex, show_ignored=False):
    for track in symuid.Track.walk(
            root_path=path,
            path_ignore_regex=path_ignore_regex,
            ignored_cb=lambda p: show_ignored and log_path(p, 'ignored'),
            unsupported_cb=lambda p, e:
                log_path_error(p, 'unsupported type, skipped'),
        ):
        if track.get_uuid() is None:
            track.assign_uuid(generate_uuid())
            log_path(track.path, 'assigned uuid {!r}'.format(track.get_uuid()))


def _init_argparser():
    import argparse
    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(
        '--show-ignored',
        action='store_true',
    )
    return argparser


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

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