#!/usr/bin/env python
from os.path import basename
from sh import metaflac
from pipes import quote as shell_quote
import argparse
import sys

if __name__ == '__main__':
    invoked_as = basename(sys.argv[0])

    try:
        if invoked_as != 'flacted' and sys.argv[1]:
            tag_requested = invoked_as.split('-')[1]
            possible = [
                tag_requested.title(),
                tag_requested.upper(),
                tag_requested.lower(),
            ]

            unfiltered_files = sys.argv[1:]
            files = []

            for file in unfiltered_files:
                try:
                    with open(file) as f:
                        files.append(file)
                except IOError as e:
                    pass

            show_filename = len(files) > 1

            for filename in files:
                for tag in possible:
                    val = metaflac(['--show-tag=%s' % (tag), filename]).strip()
                    val = val[len(tag) + 1:].splitlines()[0].strip()

                    if val:
                        if tag_requested.lower() == 'track':
                            try:
                                val = int(val)
                                val = '%02d' % (val,)
                            except TypeError:
                                val = ''

                        if show_filename:
                            print('%s: %s' % (filename, val,))
                        else:
                            print(val)

                        break

            sys.exit()
    except IndexError:
        pass

    parser = argparse.ArgumentParser()

    parser.add_argument('-t', '--title')
    parser.add_argument('-a', '--artist')
    parser.add_argument('-A', '--album')
    parser.add_argument('-y', '--year')
    parser.add_argument('-T', '--track')
    parser.add_argument('-g', '--genre')
    parser.add_argument('-p', '--picture')
    parser.add_argument('-D', '--delete-all-before', action='store_true')
    parser.add_argument('files', metavar='FILES',
                        nargs='+')

    args = parser.parse_args()
    metaflac_args = [
        '--preserve-modtime',
        '--no-utf8-convert',
    ]
    cleanup_args = metaflac_args.copy()
    destroy = args.delete_all_before

    cleanup_args.append('--remove-all-tags')
    cleanup_args.extend(args.files)

    for key in ('title', 'artist', 'album', 'year', 'track', 'genre'):
        val = getattr(args, key, None)

        if not val:
            continue

        val = val.strip()
        flac_tag = '%s%s' % (key[0].upper(), key[1:])
        metaflac_args.append('--set-tag=%s' % ('%s=%s' % (flac_tag, val)))

    if args.picture:
        try:
            with open(args.picture, 'rb'):
                metaflac_args.append('--import-picture-from=%s' %
                                     (shell_quote(args.picture)))
        except IOError:
            print('Cannot add file "%s". Specification argument is not '
                  'supported', file=sys.stderr)
            sys.exit(1)

    if len(metaflac_args) == 2:
        print('Not doing anything', file=sys.stderr)
        sys.exit(1)

    if destroy:
        metaflac(cleanup_args)

    metaflac_args.extend(args.files)
    metaflac(metaflac_args)
