#!/usr/bin/env python
# -*- coding: utf-8 -*-
# osdlyrics.py --- desktop lyrics for musicbox
# Copyright (c) 2015-2016 omi & Contributors
from __future__ import print_function, unicode_literals, division, absolute_import

import sys
from multiprocessing import Process

from future.builtins import super

from . import logger
from .config import Config

log = logger.getLogger(__name__)

config = Config()

try:
    from PyQt4 import QtGui, QtCore, QtDBus

    pyqt_activity = True
except ImportError:
    pyqt_activity = False
    log.warn("PyQt4 module not installed.")
    log.warn("Osdlyrics Not Available.")

if pyqt_activity:

    class Lyrics(QtGui.QWidget):
        def __init__(self):
            super(Lyrics, self).__init__()
            self.__dbusAdaptor = LyricsAdapter(self)
            self.initUI()

        def initUI(self):
            self.setStyleSheet("background:" + config.get("osdlyrics_background"))
            if config.get("osdlyrics_transparent"):
                self.setAttribute(QtCore.Qt.WA_TranslucentBackground)
            self.setAttribute(QtCore.Qt.WA_ShowWithoutActivating)
            self.setAttribute(QtCore.Qt.WA_X11DoNotAcceptFocus)
            self.setFocusPolicy(QtCore.Qt.NoFocus)
            if config.get("osdlyrics_on_top"):
                self.setWindowFlags(
                    QtCore.Qt.FramelessWindowHint
                    | QtCore.Qt.WindowStaysOnTopHint
                    | QtCore.Qt.X11BypassWindowManagerHint
                )
            else:
                self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
            self.setMinimumSize(600, 50)
            osdlyrics_size = config.get("osdlyrics_size")
            self.resize(osdlyrics_size[0], osdlyrics_size[1])
            scn = QtGui.QApplication.desktop().screenNumber(
                QtGui.QApplication.desktop().cursor().pos()
            )
            bl = QtGui.QApplication.desktop().screenGeometry(scn).bottomLeft()
            br = QtGui.QApplication.desktop().screenGeometry(scn).bottomRight()
            bc = (bl + br) / 2
            frameGeo = self.frameGeometry()
            frameGeo.moveCenter(bc)
            frameGeo.moveBottom(bc.y())
            self.move(frameGeo.topLeft())
            self.text = "OSD Lyrics for Musicbox"
            self.setWindowTitle("Lyrics")
            self.show()

        def mousePressEvent(self, event):
            self.mpos = event.pos()

        def mouseMoveEvent(self, event):
            if event.buttons() and QtCore.Qt.LeftButton:
                diff = event.pos() - self.mpos
                newpos = self.pos() + diff
                self.move(newpos)

        def wheelEvent(self, event):
            self.resize(self.width() + event.delta(), self.height())

        def paintEvent(self, event):
            qp = QtGui.QPainter()
            qp.begin(self)
            self.drawText(event, qp)
            qp.end()

        def drawText(self, event, qp):
            osdlyrics_color = config.get("osdlyrics_color")
            osdlyrics_font = config.get("osdlyrics_font")
            font = QtGui.QFont(osdlyrics_font[0], osdlyrics_font[1])
            pen = QtGui.QColor(
                osdlyrics_color[0], osdlyrics_color[1], osdlyrics_color[2]
            )
            qp.setFont(font)
            qp.setPen(pen)
            qp.drawText(
                event.rect(), QtCore.Qt.AlignCenter | QtCore.Qt.TextWordWrap, self.text
            )

    class LyricsAdapter(QtDBus.QDBusAbstractAdaptor):
        QtCore.Q_CLASSINFO("D-Bus Interface", "local.musicbox.Lyrics")
        QtCore.Q_CLASSINFO(
            "D-Bus Introspection",
            '  <interface name="local.musicbox.Lyrics">\n'
            '    <method name="refresh_lyrics">\n'
            '      <arg direction="in" type="s" name="lyric"/>\n'
            "    </method>\n"
            "  </interface>\n",
        )

        def __init__(self, parent):
            super(LyricsAdapter, self).__init__(parent)

        @QtCore.pyqtSlot(str)
        def refresh_lyrics(self, text):
            self.parent().text = text.replace("||", "\n")
            self.parent().repaint()

    def show_lyrics():

        app = QtGui.QApplication(sys.argv)
        lyrics = Lyrics()
        QtDBus.QDBusConnection.sessionBus().registerService("org.musicbox.Bus")
        QtDBus.QDBusConnection.sessionBus().registerObject("/", lyrics)
        sys.exit(app.exec_())


def show_lyrics_new_process():
    if pyqt_activity and config.get("osdlyrics"):
        p = Process(target=show_lyrics)
        p.daemon = True
        p.start()