#!/usr/bin/python3.13

##########
#  Presage, an extensible predictive text entry system
#  ------------------------------------------------------
#
#  Copyright (C) 2010  David Pellicer <dpellicer@warp.es>
#  Copyright (C) 2010  Matteo Vescovi <matteo.vescovi@yahoo.co.uk>
#
#  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 2 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 sys
import getopt

import dbus
import dbus.mainloop.glib

PROGRAM_NAME = 'presage_dbus_python_demo'

config = None

presage_service_name = 'org.gnome.presage.beta'
presage_service_path = '/org/gnome/presage/beta'
presage_service_interface = 'org.gnome.presage.beta'


def disclaimer():
    print("""
Presage dbus python demo
------------------------

This program is intended as a demonstration of Presage ONLY.

The Presage project aims to provide an intelligent predictive text
entry platform.

Its intent is NOT to provide a predictive text entry user interface.

Think of Presage as the predictive backend that sits behind a shiny
user interface and does all the predictive heavy lifting.
""")


def print_version():
    print("""
%s (%s) version %s
Copyright (C) 2010 Matteo Vescovi.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
to the extent permitted by law.
""" % (PROGRAM_NAME, 'presage', '0.9.1'))


def print_usage():
    print("""
Usage: %s [OPTION]...

At the prompt, type in some text. Hit enter to generate a prediction.
Any text input is valid, including no text, a single character, or a long string.

  -c, --config CONFIG  use config file CONFIG
  -h, --help           display this help and exit
  -v, --version        output version information and exit

Direct your bug reports to: %s
""" % (PROGRAM_NAME, 'matteo.vescovi@yahoo.co.uk'))


def parse_cmd_line_args():
    global config

    short_options = "c:s:hv"
    long_options = ["config=", "suggestions=", "help", "version"]

    try:
        opts, _ = getopt.getopt(sys.argv[1:], short_options, long_options)
    except getopt.GetoptError as err:
        print(str(err))
        sys.exit(1)

    for opt, arg in opts:
        if opt in ('-v', '--version'):
            print_version()
            sys.exit()
        elif opt in ('-h', '--help'):
            print_usage()
            sys.exit()
        elif opt in ('-c', '--config'):
            config = arg


def main():
    # gloop to use DBUS
    gloop = dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)

    # Get the path for the Presage object
    try:
        bus = dbus.SessionBus(gloop)
        if config:
            presage_object_path = bus.get_object(
                presage_service_name,
                presage_service_path).get_presage_object_path(config)
        else:
            presage_object_path = bus.get_object(
                presage_service_name, presage_service_path).get_presage_object_path()
        # Get the Presage object
        presage_object = bus.get_object(
            presage_service_name, presage_object_path)

        print(
            'D-BUS connection to presage object %s created' %
            presage_object_path)

    except Exception as err:
        print(err)
        sys.exit(1)

    print("Enter text at the prompt (press enter on empty line to exit):")
    string = None
    buffer = ""
    while string != "":
        string = input("> ")
        buffer += string
        results = presage_object.get_prediction(buffer, '')
        for result in results:
            print(str(result))
    presage_object.destroy()
    print("Goodbye")


if __name__ == '__main__':
    parse_cmd_line_args()
    disclaimer()
    main()
