#! /usr/bin/python3
# coding=utf-8

from __future__ import print_function
from __future__ import division
from __future__ import absolute_import
from __future__ import unicode_literals

import gi
gi.require_version("Gtk", "3.0")
gi.require_version("Gdk", "3.0")
from gi.repository import Gtk

from blueman.Functions import *
from blueman.Constants import *
from blueman.main.Sendto import Sender
from blueman.bluez.Manager import Manager
from blueman.gui.DeviceSelectorDialog import DeviceSelectorDialog

import os, sys, signal
#support running uninstalled
_dirname = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
if 'BLUEMAN_SOURCE' in os.environ:
    sys.path.insert(0, _dirname)

from optparse import OptionParser

# Workaround introspection bug, gnome bug 622084
signal.signal(signal.SIGINT, signal.SIG_DFL)


class SendTo:
    def __init__(self):
        setup_icon_path()

        usage = "Usage: %prog [options] file1 file2 ... fileN"
        parser = OptionParser(usage)
        parser.add_option("-d", "--device", dest="device",
                          action="store", help=_("Send files to this device"), metavar="ADDRESS")

        parser.add_option("", "--dest", dest="device",
                          action="store", help=_("Same as --device"), metavar="ADDRESS")

        parser.add_option("-s", "--source", dest="source",
                          action="store", help=_("Source adapter. Takes address or adapter's name eg. hci0"),
                          metavar="PATTERN")

        parser.add_option("-u", "--delete", dest="delete", action="store_true", help=_("Delete files on exit"))

        (options, args) = parser.parse_args()

        check_bluetooth_status(_("Bluetooth needs to be turned on for file sending to work"), lambda: exit())

        self.options = options

        self.files = []
        if not args:
            self.files = self.select_files()
        else:
            self.files = [os.path.abspath(f) for f in args]

        self.device = None
        self.adapter = None

        if options.delete:
            def delete_files():
                for file in self.files:
                    os.unlink(file)
            atexit.register(delete_files)

        if options.device is None:
            if not self.select_device():
                exit()

            self.do_send()

        else:
            m = Manager()
            try:
                if options.source is not None:
                    try:
                        adapter = m.get_adapter(options.source)
                    except:
                        adapter = m.get_adapter()
                else:
                    adapter = m.get_adapter()
            except:
                print("Error: No Adapters present")
                exit()
            d = m.find_device(options.device, adapter.get_object_path())

            self.device = d
            self.adapter = adapter.get_object_path()
            self.do_send()

    def do_send(self):
        if not self.files:
            dprint("No files to send")
            exit()

        sender = Sender(self.device, self.adapter, self.files)

        def on_result(sender, res):
            Gtk.main_quit()

        sender.connect("result", on_result)

    def select_files(self):
        d = Gtk.FileChooserDialog(_("Select files to send"), buttons=("_Cancel", Gtk.ResponseType.REJECT,
                                                                      "_OK", Gtk.ResponseType.ACCEPT))
        d.props.icon_name = "blueman-send-file"
        d.set_select_multiple(True)
        resp = d.run()

        if resp == Gtk.ResponseType.ACCEPT:
            files = d.get_filenames()
            d.destroy()
            return files
        else:
            d.destroy()
            return []

    def select_device(self):
        d = DeviceSelectorDialog()
        resp = d.run()
        if resp == Gtk.ResponseType.ACCEPT:
            sel = d.GetSelection()
            if sel:
                self.device = sel[1]
                self.adapter = sel[0]
                return True
            else:
                return False
        else:
            return False

if __name__ == '__main__':
    set_proc_title()
    SendTo()
    Gtk.main()
