#!/usr/bin/env python
# -*- coding: utf-8 -*-

import gettext
import gobject
import gtk
import locale
import os
import sys
from glib import source_remove
from gobject import idle_add
from ReSiStance.connectionmanager import ConnectionManager
from ReSiStance.feedmanager import FeedManager
from ReSiStance.gui import constants, FeedsWindow, LabelsWindow
from ReSiStance.portrait import FremantleRotation
from ReSiStance.settings import Settings

_ = gettext.gettext

local_src = os.path.join (os.path.dirname(__file__), 'src')
if os.path.exists(local_src):
    sys.path = [local_src] + sys.path

exit_idle_handler = 0 # Handler for exit code
manager = None # The FeedManager
settings = None # ReSiStance settings

def on_exit_idle(data):
    global manager, settings, exit_idle_handler

    # Explicitly remove the idle as this callback could last too
    # much and thus it could be triggered more than once
    source_remove(exit_idle_handler)

    # Wait until all tasks are canceled
    manager.stop()
    manager.halt()

    settings.save()

    # Save to disk without using workers
    manager.save_sync()
    idle_add(gtk.main_quit, None)
    return True

def on_exit(window, event):
    # Hide window
    window.hide()

    # We do the final operations in an idle in order to let the window close
    global exit_idle_handler
    exit_idle_handler = idle_add(on_exit_idle, None)
    return True

def main():

    gtk.gdk.threads_init()

    # Init i18n stuff
    languages = []
    lc, encoding = locale.getdefaultlocale()
    if lc:
        languages = [lc]
    languages += constants.DEFAULT_LANGUAGES
    gettext.bindtextdomain(constants.RSS_COMPACT_NAME,
                           constants.LOCALE_DIR)
    gettext.textdomain(constants.RSS_COMPACT_NAME)
    language = gettext.translation(constants.RSS_COMPACT_NAME,
                                   constants.LOCALE_DIR,
                                   languages = languages,
                                   fallback = True)
    _ = language.gettext

    # Check that user dirs exist
    if os.path.exists(constants.RSS_CONF_FOLDER) == False:
        os.makedirs(constants.RSS_CONF_FOLDER, 0700)
        os.mkdir(os.path.join(constants.RSS_CONF_FOLDER, 'icons'), 0700)

    if os.path.exists(constants.RSS_DB_DIR) == False:
        os.makedirs(constants.RSS_DB_DIR, 0700)

    # Main Window
    global manager, settings
    conn_manager = ConnectionManager()
    settings = Settings()
    settings.load()
    manager = FeedManager(settings, conn_manager)

    if settings.show_labels_startup:
        win = LabelsWindow(manager, settings, conn_manager)
    else:
        win = FeedsWindow(manager, settings, conn_manager)

    # Rotation manager
    rotation_manager = FremantleRotation(constants.RSS_NAME, win, constants.RSS_VERSION,
                                         FremantleRotation.AUTOMATIC)
    win.set_rotation_manager(rotation_manager)

    # Handle program exit
    win.connect('delete-event', on_exit)

    win.show()
    gtk.main()

if __name__ == "__main__":
    main()
