# Python imports
import os
import threading
import subprocess
import requests
import shutil

# Lib imports
import gi
gi.require_version('Gtk', '3.0')
gi.require_version('GdkPixbuf', '2.0')
from gi.repository import Gtk
from gi.repository import GLib
from gi.repository import GdkPixbuf

# Application imports
from plugins.plugin_base import PluginBase
from .tmdbscraper import scraper


# NOTE: Threads WILL NOT die with parent's destruction.
def threaded(fn):
    def wrapper(*args, **kwargs):
        threading.Thread(target=fn, args=args, kwargs=kwargs, daemon=False).start()
    return wrapper

# NOTE: Threads WILL die with parent's destruction.
def daemon_threaded(fn):
    def wrapper(*args, **kwargs):
        threading.Thread(target=fn, args=args, kwargs=kwargs, daemon=True).start()
    return wrapper




class Plugin(PluginBase):
    def __init__(self):
        super().__init__()

        self.name                   = "Movie/TV Info"   # NOTE: Need to remove after establishing private bidirectional 1-1 message bus
                                                        #       where self.name should not be needed for message comms
        self.path                   = os.path.dirname(os.path.realpath(__file__))
        self._GLADE_FILE            = f"{self.path}/movie_tv_info.glade"

        self._dialog                = None
        self._thumbnail_preview_img = None
        self._tmdb                  = scraper.get_tmdb_scraper()
        self._overview              = None
        self._file_name             = None
        self._file_location         = None
        self._trailer_link          = None


    def run(self):
        self._builder = Gtk.Builder()
        self._builder.add_from_file(self._GLADE_FILE)
        self._connect_builder_signals(self, self._builder)

        self._thumbnailer_dialog    = self._builder.get_object("info_dialog")
        self._overview              = self._builder.get_object("textbuffer")
        self._file_name             = self._builder.get_object("file_name")
        self._file_location         = self._builder.get_object("file_location")
        self._thumbnail_preview_img = self._builder.get_object("thumbnail_preview_img")
        self._file_hash             = self._builder.get_object("file_hash")
        self._trailer_link          = self._builder.get_object("trailer_link")

    def generate_reference_ui_element(self):
        item = Gtk.ImageMenuItem(self.name)
        item.set_image( Gtk.Image(stock=Gtk.STOCK_FIND) )
        item.connect("activate", self._show_info_page)
        item.set_always_show_image(True)
        return item

    @threaded
    def _show_info_page(self, widget=None, eve=None):
        self._event_system.emit("get_current_state")

        state               = self._fm_state
        self._event_message = None

        GLib.idle_add(self._process_changes, (state))

    def _process_changes(self, state):
        self._fm_state = None

        if state.uris and len(state.uris) == 1:
            self._fm_state = state
            self._set_ui_data()
            response   = self._thumbnailer_dialog.run()
            if response in [Gtk.ResponseType.CLOSE, Gtk.ResponseType.DELETE_EVENT]:
                self._thumbnailer_dialog.hide()

    def _set_ui_data(self):
        title, path, trailer, video_data = self.get_video_data()
        keys = video_data.keys() if video_data else None

        overview_text  = video_data["overview"] if video_data else f"...NO {self.name.upper()} DATA..."

        self.set_text_data(title, path, overview_text)
        self.set_thumbnail(video_data) if video_data else ...
        self.set_trailer_link(trailer)

        print(video_data["videos"]) if not keys in ("", None) and "videos" in keys else ...

    def get_video_data(self):
        uri            = self._fm_state.uris[0]
        path           = self._fm_state.tab.get_current_directory()
        parts          = uri.split("/")
        _title         = parts[ len(parts) - 1 ]
        trailer        = None

        try:
            title          = _title.split("(")[0].strip()
            startIndex     = _title.index('(') + 1
            endIndex       = _title.index(')')
            date           = title[startIndex:endIndex]
        except Exception as e:
            print(repr(e))
            title          = _title
            date           = None

        try:

            video_data    = self._tmdb.search(title, date)[0]
            video_id      = video_data["id"]
            try:
                results = self._tmdb.tmdbapi.get_movie(str(video_id), append_to_response="videos")["videos"]["results"]
                for result in results:
                    if "YouTube" in result["site"]:
                        trailer = result["key"]

                if not trailer:
                    raise Exception("No key found. Defering to none...")
            except Exception as e:
                print("No trailer found...")

        except Exception as e:
            print(repr(e))
            video_data    = None

        return title, path, trailer, video_data


    def set_text_data(self, title, path, overview_text):
        self._file_name.set_text(title)
        self._file_location.set_text(path)
        self._overview.set_text(overview_text)

    @threaded
    def set_thumbnail(self, video_data):
        background_url = video_data["backdrop_path"]
        # background_url = video_data["poster_path"]
        background_pth = "/tmp/sfm_mvtv_info.jpg"

        try:
            os.remove(background_pth)
        except Exception as e:
            ...

        r = requests.get(background_url, stream = True)

        if r.status_code == 200:
            r.raw.decode_content = True
            with open(background_pth,'wb') as f:
                shutil.copyfileobj(r.raw, f)

            print('Cover Background Image sucessfully retreived...')
            preview_pixbuf = GdkPixbuf.Pixbuf.new_from_file(background_pth)
            self._thumbnail_preview_img.set_from_pixbuf(preview_pixbuf)
        else:
            print('Cover Background Image Couldn\'t be retreived...')

    def set_trailer_link(self, trailer):
        if trailer:
            self._trailer_link.set_uri(f"https://www.youtube.com/watch?v={trailer}")