#!/usr/bin/env python3
"""Live helpers for the library scenarios (docs/plan/milionar-library/120 §3): drive real Kodi, read library.db.

  live.py setup            fixture provider on, thresholds low, fixture TMDb data seeded
  live.py teardown         settings back to defaults, fixture provider off
  live.py play movie|episode TMDB [S E] [--resume]     start a canonical play through mplay_req
  live.py stop             PlayerControl(Stop)
  live.py state            library.db rows (movie_state, episode_state, last play_log rows) + Kodi's own view
  live.py log SECONDS      Milionář tracker/library lines of kodi.log since the last `mark`
"""
import json
import os
import sqlite3
import sys

HERE = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, os.path.join(HERE, '..', 'dialog_harness'))
import kodi_live as kl  # noqa: E402

DB = os.path.expanduser('~/Library/Application Support/Kodi/userdata/addon_data/plugin.video.milionar/library.db')
DEFAULTS = {'lib_resume_min_seconds': '180', 'lib_watched_percent': '90', 'dev_fixture_provider': 'false'}


def ops(*items):
    return kl.request(list(items), timeout=60)['results']


def setting(key, value):
    return {'op': 'addon_setting', 'key': key, 'value': value}


def state():
    conn = sqlite3.connect('file:{}?mode=ro'.format(DB), uri=True)
    conn.row_factory = sqlite3.Row
    for table in ('movie_state', 'episode_state'):
        for row in conn.execute('SELECT * FROM {}'.format(table)):
            print(table, {k: row[k] for k in row.keys() if row[k] not in (None, 0, 0.0)})
    for row in conn.execute('SELECT * FROM play_log ORDER BY id DESC LIMIT 5'):
        print('play_log', dict(row))


def kodi_view(canonical):
    reply = kl.request([{'op': 'jsonrpc', 'request': {'jsonrpc': '2.0', 'id': 1, 'method': 'Files.GetFileDetails', 'params': {
        'file': canonical, 'media': 'video', 'properties': ['playcount', 'resume', 'lastplayed']}}}])['results'][0]['result']
    print('kodi', canonical.split('?', 1)[1], reply.get('result', {}).get('filedetails'))


def main():
    cmd = sys.argv[1]
    if cmd == 'setup':
        ops(setting('dev_fixture_provider', 'true'), setting('lib_resume_min_seconds', '10'),
            {'op': 'call', 'module': 'wcs.library2.fixture_provider', 'func': 'seed_meta', 'args': [None, True]})
        print('fixture provider on, resume threshold 10 s, fixture TMDb data seeded')
    elif cmd == 'teardown':
        ops(*[setting(k, v) for k, v in DEFAULTS.items()])
        print('settings restored')
    elif cmd == 'play':
        kind, tmdb = sys.argv[2], sys.argv[3]
        start = 'resume' if '--resume' in sys.argv else 'start'
        query = 'type=movie&tmdb={}'.format(tmdb) if kind == 'movie' else 'type=episode&tmdb={}&s={}&e={}'.format(tmdb, sys.argv[4], sys.argv[5])
        ops({'op': 'builtin', 'cmd': 'RunPlugin(plugin://plugin.video.milionar/?action=mplay_req&{}&from={})'.format(query, start)})
        print('requested', query, start)
    elif cmd == 'stop':
        ops({'op': 'builtin', 'cmd': 'PlayerControl(Stop)'})
    elif cmd == 'state':
        state()
        for url in sys.argv[2:]:
            kodi_view(url)
    elif cmd == 'info':
        print(json.dumps(ops({'op': 'info', 'labels': ['Player.Time', 'Player.Duration', 'Player.Filenameandpath'],
                              'conds': ['Player.HasVideo', 'Player.Paused']})[0]['result']['labels']))


if __name__ == '__main__':
    main()
