import os
import shutil
from functools import partial
from PyQt5 import QtCore, QtWidgets, QtGui


class MainWindowWidget(QtWidgets.QWidget):

    def __init__(self, app):
        super(MainWindowWidget, self).__init__()
        self.setAcceptDrops(True)
        self.windowTitleChanged.connect(self.title_changed)
        self.app = app
        
    def title_changed(self, title):
        self.setWindowTitle(title)
        if ui.new_tray_widget and ui.float_window:
            if hasattr(ui, "player_val") and ui.player_val == "libmpv":
                ui.float_window.setWindowTitle(title)
                ui.new_tray_widget.title.setText("")
                ui.new_tray_widget.title1.setText("")
                if not ui.new_tray_widget.title1.isHidden():
                    ui.new_tray_widget.title1.hide()
                if ui.view_mode == "thumbnail_light":
                    ui.labelFrame2.setText(title)
        
    def dragEnterEvent(self, event):
        data = event.mimeData()
        if data.hasUrls():
            event.accept()
        else:
            event.ignore()

    def resizeEvent(self, event):
        if "ui" in globals():
            if hasattr(ui, "screen_size") and hasattr(ui, "gui_signals"):
                rect = self.app.desktop().availableGeometry(self)
                size_tuple = (rect.width(), rect.height())
                if ui.screen_size == size_tuple:
                    ui.logger.debug("same screen dimensions")
                else:
                    ui.logger.debug("screen dimensions changed..so resizing")
                    ui.gui_signals.adjust_mainwindow(size_tuple)
    
    def set_globals(self, uiwidget):
        global ui
        ui = uiwidget
    
    def dropEvent(self, event):
        urls = event.mimeData().urls()
        for url in urls:
            url = url.toString()
            ui.logger.debug(url)
            if url.startswith('file:///') or url.startswith('http') or url.startswith('magnet:'):
                if os.name == 'posix':
                    url = url.replace('file://', '', 1)
                else:
                    url = url.replace('file:///', '', 1)
            ext = None
            if '.' in url:
                ext = url.rsplit('.', 1)[-1]
                ext = ext.lower()
            rect = QtCore.QRect(ui.label.x(), ui.label.y(), ui.label.width(), ui.label.height())
            pos = event.pos()
            name = ui.get_parameters_value(n='name')['name']
            if rect.contains(pos):
                poster_drop = True
                out_file = os.path.join(ui.tmp_download_folder, name+'.jpg')
            else:
                poster_drop = False
                out_file = os.path.join(ui.tmp_download_folder, name+'-fanart.jpg')
            if ext and ext in ['jpg', 'jpeg', 'png'] and not url.startswith('http'):
                if os.path.isfile(url):
                    shutil.copy(url, out_file)
                ui.gui_signals.poster_drop(poster_drop, url, name)
            elif url.startswith('http'):
                url = url.replace(' ', '%20')
                ui.vnt.head(url, onfinished=partial(self.process_dropped_url, poster_drop, name))
            else:
                ui.watch_external_video('{}'.format(url), start_now=True)
    
    def process_dropped_url(self, *args):
        result = args[-1]
        url = args[-2]
        poster_drop = args[0]
        nm = args[1]
        if poster_drop:
            out_file = os.path.join(ui.tmp_download_folder, nm+'.jpg')
        else:
            out_file = os.path.join(ui.tmp_download_folder, nm+'-fanart.jpg')
        if result.error is None:
            if (result.content_type in ['image/jpeg', 'image/png', 'image/webp']
                    or url.endswith('.jpg') or url.endswith('.png')):
                ui.vnt.get(url, out=out_file, onfinished=partial(self.download_fanart, poster_drop, nm))
            else:
                ui.gui_signals.poster_drop(poster_drop, url, nm)
        elif url.endswith('.jpg') or url.endswith('.png'):
            ui.vnt.get(url, out=out_file, onfinished=partial(self.download_fanart, poster_drop))
            
    def download_fanart(self, *args):
        result = args[-1]
        url = args[-2]
        poster_drop = args[0]
        nm = args[1]
        if result.error is None:
            ui.gui_signals.poster_drop(poster_drop, result.out_file, nm)
        
    def mouseMoveEvent(self, event):
        pos = event.pos()
        px = pos.x()
        x = self.width()
        dock_w = ui.dockWidget_3.width()
        if ui.orientation_dock == 'right':
            if px <= x and px >= x-6 and ui.auto_hide_dock:
                ui.dockWidget_3.show()
                if ui.player_val != 'mplayer':
                    ui.btn1.setFocus()
                ui.logger.info('show options sidebar')
            elif px <= x-dock_w and ui.auto_hide_dock:
                ui.dockWidget_3.hide()
                if not ui.list1.isHidden() and ui.player_val != 'mplayer':
                    ui.list1.setFocus()
                elif not ui.list2.isHidden() and ui.player_val != 'mplayer':
                    ui.list2.setFocus()
        else:
            if px >= 0 and px <= 10 and ui.auto_hide_dock:
                ui.dockWidget_3.show()
                if ui.player_val != 'mplayer':
                    ui.btn1.setFocus()
                ui.logger.info('show options sidebar')
            elif px >= dock_w and ui.auto_hide_dock:
                ui.dockWidget_3.hide()
                if not ui.list1.isHidden() and ui.player_val != 'mplayer':
                    ui.list1.setFocus()
                elif not ui.list2.isHidden() and ui.player_val != 'mplayer':
                    ui.list2.setFocus()
        if self.isFullScreen() and ui.mpvplayer_val.processId() > 0:
            ui.logger.info('FullScreen Window but not video')
            if (not ui.tab_6.isHidden() or not ui.list2.isHidden()
                    or not ui.list1.isHidden() or not ui.tab_2.isHidden()):
                if ui.frame1.isHidden():
                    ui.frame1.show()
            else:
                ht = self.height()
                if pos.y() <= ht and pos.y() > ht - 5 and ui.frame1.isHidden():
                    ui.frame1.show()
                    ui.frame1.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
                elif pos.y() <= ht-32 and not ui.frame1.isHidden():
                    site = ui.get_parameters_value(s='site')['site']
                    if site != 'Music' and ui.list2.isHidden() and ui.tab_6.isHidden() and ui.tab_2.isHidden():
                        ui.frame1.hide()



class EventFilterFloatWindow(QtCore.QObject):

    def set_globals(self, uiwidget):
        global ui
        ui = uiwidget
        
    def eventFilter(self, receiver, event):
        if event.type():
            if(event.type() == QtCore.QEvent.Enter):
                if ui.float_timer.isActive():
                    ui.float_timer.stop()
                if ui.new_tray_widget.hasFocus():
                    print('focus')
                else:
                    print('unFocus')
                return 0
            elif(event.type() == QtCore.QEvent.Leave):
                if ui.new_tray_widget.remove_toolbar:
                    if ui.float_timer.isActive():
                        ui.float_timer.stop()
                    ui.float_timer.start(10)
                return 0
            else:
                return super(EventFilterFloatWindow, self).eventFilter(receiver, event)
        else:
            return super(EventFilterFloatWindow, self).eventFilter(receiver, event)