# -*- coding: utf-8 -*-
"""Minimal Kodi modules (xbmc, xbmcaddon, xbmcgui, xbmcvfs, xbmcplugin) so addon code runs offline in the tests."""
import os
import json
import sys
import types

ADDON_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
LOG = []
BUILTINS = []


class Window:
    """A window / dialog with properties, the way the game panel uses it."""

    def __init__(self, *args, **kwargs):
        self._props = {}
        self.focus = None
        self.closed = False

    def __new__(cls, *args, **kwargs):
        return object.__new__(cls)

    def setProperty(self, key, value):
        self._props[key] = value

    def getProperty(self, key):
        return self._props.get(key, '')

    def clearProperty(self, key):
        self._props.pop(key, None)

    def setFocusId(self, control_id):
        self.focus = control_id

    def getFocusId(self):
        return self.focus

    def getControl(self, control_id):
        return control_id

    def doModal(self):
        pass

    def close(self):
        self.closed = True

    def onAction(self, action):
        pass


class ListItem:
    def __init__(self, label='', label2='', path='', offscreen=False):
        self.label, self.path, self.props, self.art, self.info = label, path, {}, {}, {}

    def getPath(self):
        return self.path

    def setArt(self, art):
        self.art.update(art)

    def setProperty(self, key, value):
        self.props[key] = value

    def getProperty(self, key):
        return self.props.get(key, '')

    def getVideoInfoTag(self):
        item = self

        class Tag:
            def __getattr__(self, name):
                return lambda value=None, *a: item.info.__setitem__(name, value)
        return Tag()


def install():
    """Fake Kodi modules (once per process); settings are empty, so autoplay and TTS are off."""
    if 'xbmc' in sys.modules and getattr(sys.modules['xbmc'], 'IS_STUB', False):
        return
    if ADDON_DIR not in sys.path:
        sys.path.insert(0, ADDON_DIR)

    xbmc = types.ModuleType('xbmc')
    xbmc.IS_STUB = True
    xbmc.LOGDEBUG, xbmc.LOGINFO, xbmc.LOGWARNING, xbmc.LOGERROR = 0, 1, 2, 3
    xbmc.log = lambda msg, level=1: LOG.append((level, msg))
    xbmc.getCondVisibility = lambda condition: False
    xbmc.executebuiltin = lambda command, wait=False: BUILTINS.append(command)
    xbmc.getInfoLabel = lambda label: ''
    xbmc.executeJSONRPC = lambda request: json.dumps({'jsonrpc': '2.0', 'id': json.loads(request).get('id'),
                                                     'result': {}})
    xbmc.getSkinDir = lambda: 'skin.milionar'
    xbmc.sleep = lambda ms: None
    sys.modules['xbmc'] = xbmc

    xbmcaddon = types.ModuleType('xbmcaddon')

    class Addon:
        def __init__(self, addon_id=None):
            pass

        def getSetting(self, key):
            return ''

        def getAddonInfo(self, key):
            return ADDON_DIR if key == 'path' else 'plugin.video.milionar'

        def getLocalizedString(self, string_id):
            return str(string_id)
    xbmcaddon.Addon = Addon
    sys.modules['xbmcaddon'] = xbmcaddon

    xbmcgui = types.ModuleType('xbmcgui')
    xbmcgui.Window = Window
    xbmcgui.WindowXMLDialog = Window
    xbmcgui.ListItem = ListItem
    xbmcgui.NOTIFICATION_INFO, xbmcgui.NOTIFICATION_ERROR = 'info', 'error'
    xbmcgui.getCurrentWindowId = lambda: 10000
    xbmcgui.Dialog = lambda: types.SimpleNamespace(notification=lambda *a, **k: None)
    sys.modules['xbmcgui'] = xbmcgui

    xbmcvfs = types.ModuleType('xbmcvfs')
    xbmcvfs.translatePath = lambda path: path.replace('special://profile/', '/tmp/milionar-test-profile/')
    sys.modules['xbmcvfs'] = xbmcvfs

    xbmcplugin = types.ModuleType('xbmcplugin')
    sys.modules['xbmcplugin'] = xbmcplugin
