#!/usr/bin/python3
"""
lark

Verify and sort game ROM images.
"""
# TODO: Write decent UI
import hashlib
import sys
import os
import xdg.BaseDirectory

#import dat
from lark import metadata

HASH_CHUNK_SIZE = 10485760 # 10mb
SQLITE_FILENAME = 'metadata.db'

data_path = os.path.join(xdg.BaseDirectory.xdg_data_home, 'lark')

def get_sha1sum(filename):
    sha1sum = hashlib.sha1()
    with open(filename, 'rb') as file_contents:
        while True:
            chunk = file_contents.read(HASH_CHUNK_SIZE)
            if not chunk:
                break
            sha1sum.update(chunk)

    return sha1sum.hexdigest()

# Test code! :D
# TODO: Write test code that doesn't depend on external resources.

def _kwargs_parse(kwargs_list):
    kwargs = {}
    for kwarg_string in kwargs_list:
        key, value = kwarg_string.split('=')
        kwargs[key] = value

    return kwargs

action_object = sys.argv[1]
action = sys.argv[2]

metadata.configure(os.path.join(data_path, SQLITE_FILENAME))

# TODO: Use a real UI library. This mess is just intended for development.
if action_object == 'platform':
    if action == 'add':
        print('add a platform')
        platform_shortcode = sys.argv[3]
        platform_name = sys.argv[4]

        platform_data = metadata.Platform(shortcode=platform_shortcode,
                                            fullname=platform_name)
        with metadata.get_db_session() as session:
            session.add(platform_data)

    elif action == 'list':
        # TODO: Filter support is exclusively limited to SQLAlchemy's filter.ilike function. Figure
        # out a good way to include other filters.
        filters = _kwargs_parse(sys.argv[3:])
        with metadata.get_db_session() as session:
            print(metadata.search(session, metadata.Platform, **filters))

    elif action == 'remove':
        constraints = sys.argv[3:]
        filters = _kwargs_parse(sys.argv[3:])

        with metadata.get_db_session() as session:
            platforms = metadata.search(session, metadata.Platform, **filters)
            for platform in platforms:
                print('Removing %s.' % platform.fullname)
                session.delete(platform)

    elif action == 'test':
        # TODO: Delete this action before merging into dev. It's just for ugly testing.
        platform_shortcode = sys.argv[3]
        platform_name = sys.argv[4]

        platform_data = metadata.Platform(shortcode=platform_shortcode,
                                            fullname=platform_name)

        with metadata.get_db_session() as session:
            print(metadata.search(session, metadata.Platform))

elif action_object == 'release-group':
    if action == 'add':
        properties = _kwargs_parse(sys.argv[3:])
        release_group = metadata.ReleaseGroup(name=properties['name'])

        with metadata.get_db_session() as session:
            if properties['platform']:
                platform = metadata.search(session, metadata.Platform,
                                             shortcode=properties['platform'])[0]
                release_group.platform = platform
            session.add(release_group)

    if action == 'list':
        # TODO: Filter support is exclusively limited to SQLAlchemy's filter.ilike function. Figure
        # out a good way to include other filters.
        print('Listing release groups.')
        filters = _kwargs_parse(sys.argv[3:])
        with metadata.get_db_session() as session:
            print(metadata.search(session, metadata.ReleaseGroup, **filters))

    elif action == 'remove':
        constraints = sys.argv[3:]
        filters = _kwargs_parse(sys.argv[3:])

        with metadata.get_db_session() as session:
            release_groups = metadata.search(session, metadata.ReleaseGroup, **filters)
            for release_group in release_groups:
                print('Removing %s.' % release_group.name)
                session.delete(release_group)

elif action_object == 'release':
    if action == 'add':
        properties = _kwargs_parse(sys.argv[3:])
        release = metadata.Release(**properties)

        with metadata.get_db_session() as session:
            if properties['release-group']:
                release_group = metadata.search(session, metadata.ReleaseGroup,
                                                  name=properties['release-group'])[0]
                release.release_group = release_group
            session.add(release)

    if action == 'list':
        # TODO: Filter support is exclusively limited to SQLAlchemy's filter.ilike function. Figure
        # out a good way to include other filters.
        print('Listing releases.')
        filters = _kwargs_parse(sys.argv[3:])
        with metadata.get_db_session() as session:
            print(metadata.search(session, metadata.Release, **filters))

    elif action == 'remove':
        constraints = sys.argv[3:]
        filters = _kwargs_parse(sys.argv[3:])

        with metadata.get_db_session() as session:
            release_groups = metadata.search(session, metadata.Release, **filters)
            for release in release_groups:
                print('Removing %s.' % release.name)
                session.delete(release)
else:
    print('Unknown object.')
