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

"""

    Copyright (C) 2011-2013 Martijn Kaijser
    Copyright (C) 2013-2014 Team-XBMC
    Copyright (C) 2014-2019 Team Kodi

    This file is part of service.xbmc.versioncheck

    SPDX-License-Identifier: GPL-3.0-or-later
    See LICENSES/GPL-3.0-or-later.txt for more information.

"""

from contextlib import closing
import os
import sys

import xbmc  # pylint: disable=import-error
import xbmcaddon  # pylint: disable=import-error
import xbmcgui  # pylint: disable=import-error
import xbmcvfs  # pylint: disable=import-error

_ADDON = xbmcaddon.Addon('service.xbmc.versioncheck')
_ADDON_NAME = _ADDON.getAddonInfo('name')
if sys.version_info[0] >= 3:
    _ADDON_PATH = _ADDON.getAddonInfo('path')
else:
    _ADDON_PATH = _ADDON.getAddonInfo('path').decode('utf-8')
_ICON = _ADDON.getAddonInfo('icon')


class Viewer:
    """ Show user a text viewer (WINDOW_DIALOG_TEXT_VIEWER)
    Include the text file for the viewers body in the resources/ directory

    usage:
        script_path = os.path.join(_ADDON_PATH, 'resources', 'lib', 'version_check', 'viewer.py')
        xbmc.executebuiltin('RunScript(%s,%s,%s)' % (script_path, 'Heading', 'notice.txt'))

    :param heading: text viewer heading
    :type heading: str
    :param filename: filename to use for text viewers body
    :type filename: str
    """
    WINDOW = 10147
    CONTROL_LABEL = 1
    CONTROL_TEXTBOX = 5

    def __init__(self, heading, filename):
        self.heading = heading
        self.filename = filename
        # activate the text viewer window
        xbmc.executebuiltin('ActivateWindow(%d)' % (self.WINDOW,))
        # get window
        self.window = xbmcgui.Window(self.WINDOW)
        # give window time to initialize
        xbmc.sleep(100)
        # set controls
        self.set_controls()

    def set_controls(self):
        """ Set the window controls
        """
        # get text viewer body text
        text = self.get_text()
        # set heading
        self.window.getControl(self.CONTROL_LABEL).setLabel('%s : %s' % (_ADDON_NAME,
                                                                         self.heading,))
        # set text
        self.window.getControl(self.CONTROL_TEXTBOX).setText(text)
        xbmc.sleep(2000)

    def get_text(self):
        """ Get the text viewers body text from self.filename

        :return: contents of self.filename
        :rtype: str
        """
        try:
            return self.read_file(self.filename)
        except Exception as error:  # pylint: disable=broad-except
            xbmc.log(_ADDON_NAME + ': ' + str(error), xbmc.LOGERROR)
        return ''

    @staticmethod
    def read_file(filename):
        """ Read the contents of the provided file, from
        os.path.join(_ADDON_PATH, 'resources', filename)

        :param filename: name of file to read
        :type filename: str
        :return: contents of the provided file
        :rtype: str
        """
        filename = os.path.join(_ADDON_PATH, 'resources', filename)
        with closing(xbmcvfs.File(filename)) as open_file:
            contents = open_file.read()
        return contents


class WebBrowser:
    """ Display url using the default browser

    usage:
        script_path = os.path.join(_ADDON_PATH, 'resources', 'lib', 'version_check', 'viewer.py')
        xbmc.executebuiltin('RunScript(%s,%s,%s)' % (script_path, 'webbrowser', 'https://kodi.tv/'))

    :param url: url to open
    :type url: str
    """

    def __init__(self, url):
        self.url = url
        try:
            # notify user
            self.notification(_ADDON_NAME, self.url)
            xbmc.sleep(100)
            # launch url
            self.launch_url()
        except Exception as error:  # pylint: disable=broad-except
            xbmc.log(_ADDON_NAME + ': ' + str(error), xbmc.LOGERROR)

    @staticmethod
    def notification(heading, message, icon=None, time=15000, sound=True):
        """ Create a notification

        :param heading: notification heading
        :type heading: str
        :param message: notification message
        :type message: str
        :param icon: path and filename for the notification icon
        :type icon: str
        :param time: time to display notification
        :type time: int
        :param sound: is notification audible
        :type sound: bool
        """
        if not icon:
            icon = _ICON
        xbmcgui.Dialog().notification(heading, message, icon, time, sound)

    def launch_url(self):
        """ Open self.url in the default web browser
        """
        import webbrowser  # pylint: disable=import-outside-toplevel
        webbrowser.open(self.url)


if __name__ == '__main__':
    try:
        if sys.argv[1] == 'webbrowser':
            WebBrowser(sys.argv[2])
        else:
            Viewer(sys.argv[1], sys.argv[2])
    except Exception as err:  # pylint: disable=broad-except
        xbmc.log(_ADDON_NAME + ': ' + str(err), xbmc.LOGERROR)
