#!/usr/bin/python3
# -*- coding: utf-8 -*-
#
#       kazam
#
#       Copyright 2012 David Klasinc <bigwhale@lubica.net>
#       Copyright 2010 Andrew <andrew@karmic-desktop>
#
#       This program is free software; you can redistribute it and/or modify
#       it under the terms of the GNU General Public License as published by
#       the Free Software Foundation; either version 3 of the License, or
#       (at your option) any later version.
#
#       This program is distributed in the hope that it will be useful,
#       but WITHOUT ANY WARRANTY; without even the implied warranty of
#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#       GNU General Public License for more details.
#
#       You should have received a copy of the GNU General Public License
#       along with this program; if not, write to the Free Software
#       Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
#       MA 02110-1301, USA.

import os
import sys
import dbus
import logging
import dbus.service
from argparse import ArgumentParser
from dbus.mainloop.glib import DBusGMainLoop

from gi.repository import Gtk


class KazamService(dbus.service.Object):

    def __init__(self, app):
        self.app = app
        bus_name = dbus.service.BusName('org.kazam', bus=dbus.SessionBus())
        dbus.service.Object.__init__(self, bus_name, "/org/kazam")

    @dbus.service.method('org.kazam')
    def instance(self):
        self.app.window.show()
        self.app.window.present()

    @dbus.service.method('org.kazam')
    def prefs(self):
        self.app.cb_preferences_request(None)

if __name__ == "__main__":

    logger = logging.getLogger()
    logger.name = "Kazam"
    handler = logging.StreamHandler()
    formatter = logging.Formatter('%(levelname)s %(name)s - %(message)s')
    handler.setFormatter(formatter)
    logger.addHandler(handler)
    logger.setLevel(logging.INFO)

    logger.debug("Logger intialized.")

    if os.path.exists("./kazam") and os.path.exists("../data"):
        logger.warning("Running from local directory, AppIndicator icons could be missing.")
        datadir = "../data"
        sys.path.insert(0, "..")
    else:
        # A bit more flexible setting of datadir, it works
        # when base install path is not /usr
        curpath = os.path.abspath(__file__)
        curpath = os.path.realpath(curpath)
        datadir = curpath.split('bin/')[0] + "share/kazam/"

    try:
        import platform
        dist = platform.linux_distribution()
    except:
        # Fallback to the almighty Ubuntu 12.10 ;)
        dist = ('Ubuntu', '12.10', 'quantal')
        logger.warning("Failed to correctly detect operating system.")

    from kazam.version import *
    version = "%(prog)s {0} '{1}'".format(VERSION, CODENAME)
    parser = ArgumentParser(description="Kazam - Screen recording and capturing program.")

    parser.add_argument("--debug",              action="store_true",  help="enable debug mode")
    parser.add_argument("--silent",             action="store_true",  help="silent start, no UI shown")
    parser.add_argument("--nosound",            action="store_false", help="disable PulseAudio")
    parser.add_argument("--test",               action="store_true",  help="generate test video signal")
    parser.add_argument("-v", "--version",      action="version",     version=version)
    parser.add_argument("-f", "--fullscreen",   action="store_true",  help="instant screenshot of a full screen")
    parser.add_argument("-a", "--area",         action="store_true",
                        help="instant screenshot of a preselected screen area")
    parser.add_argument("-s", "--select",       action="store_true",  help="instant screenshot of a preselected window")
    parser.add_argument("-w", "--window",       action="store_true",  help="instant screenshot of an active window")
    parser.add_argument("-p", "--preferences",  action="store_true",  help="show preferences window")
    parser.add_argument("-g", "--godmode",      action="store_true",  help="god mode of capture")
    parser.add_argument("-x", "--instance",     action="store_true",  help="spawn new instance")

    args = parser.parse_args()
    if args.debug:
        logger.setLevel(logging.DEBUG)
    else:
        logger.setLevel(logging.INFO)

    logger.debug("Starting ...")
    logger.debug("Running on: {0} {1}".format(dist[0], dist[1]))
    logger.debug("Kazam version: {0} {1}".format(VERSION, CODENAME))

    if args.fullscreen:
        from kazam.instant import InstantApp
        app = InstantApp(datadir, dist, args.debug, 1)  # MODE_ALL
    elif args.area:
        from kazam.instant import InstantApp
        app = InstantApp(datadir, dist, args.debug, 2)  # MODE_AREA
    elif args.select:
        from kazam.instant import InstantApp
        app = InstantApp(datadir, dist, args.debug, 3)  # MODE_WIN
    elif args.window:
        from kazam.instant import InstantApp
        app = InstantApp(datadir, dist, args.debug, 4)  # MODE_ACTIVE
    elif args.godmode:
        from kazam.instant import InstantApp
        app = InstantApp(datadir, dist, args.debug, 666)  # MODE_ACTIVE
    else:

        DBusGMainLoop(set_as_default=True)
        bus = dbus.SessionBus()
        instance = bus.request_name("org.kazam")

        if not args.instance and instance != dbus.bus.REQUEST_NAME_REPLY_PRIMARY_OWNER:
            logger.debug("Getting existing instance ...")
            if args.preferences:
                logger.debug("Opening preferences ...")
                app = dbus.SessionBus().get_object("org.kazam", "/org/kazam").get_dbus_method("prefs")
            else:
                logger.debug("Showing main window ...")
                app = dbus.SessionBus().get_object("org.kazam", "/org/kazam").get_dbus_method("instance")
            app()
            sys.exit(0)
        else:
            if args.preferences:
                from kazam.instant import InstantApp
                app = InstantApp(datadir, dist, args.debug, 0, preferences=True)
            else:
                logger.debug("Starting new instance ...")
                from kazam.app import KazamApp
                app = KazamApp(datadir, dist, args.debug, args.test, args.nosound, args.silent)

                kazam_service = KazamService(app)

    Gtk.main()
    logger.debug("Finishing ...")
    sys.exit(0)
