#!/usr/bin/env python3
#
# Copyright (c) 2020 VIAVI, Inc.
#
# Written by Fabien Proriol <fabien.proriol@jdsu.com>
#
#
import sys
import dbus.mainloop.glib
import ctypes
import syslog
from viavi.release.manager import ReleaseManager


class stdsyslog(object):
    def __init__(self, out, name=None):
        self._name = name
        self._out = out
        self.encoding = 'ascii'
        syslog.openlog('release-manager', facility=syslog.LOG_DAEMON)

    def write(self, data):
        if len(data.strip()) == 0:
            return
        self._out.write("%s\n" % data.rstrip())
        if self._name is not None:
            syslog.syslog('%s: %s' % (self._name, data.strip()))
        else:
            syslog.syslog('%s' % (data.strip()))

    def flush(self):
        return self._out.flush()

    def isatty(self):
        return self._out.isatty()


if __name__ == "__main__":
    retcode = 0

    if len(sys.argv) == 2 and sys.argv[1] == "daemon":
        print("Start Dbus Daemon")
        # change daemon name from python to release-manager
        bstdout = sys.stdout
        bstderr = sys.stderr
        sys.stdout = stdsyslog(bstdout)
        sys.stderr = stdsyslog(bstderr, "ERROR")
        libc = ctypes.cdll.LoadLibrary('libc.so.6')
        libc.prctl(15, b'release-manager', 0, 0, 0)
        sma = ReleaseManager(daemon = True)
        sma.start_daemon()
        print("Stop Dbus Daemon")
        exit(0)


    url_proxy = ""
    for i in sys.argv:
        if i == "--proxy":
            url_proxy = sys.argv.pop()
            sys.argv.pop()
            break

    try:
        dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
        bus = dbus.SystemBus()
        daemon_started = bus.name_has_owner('com.viavi.releasemanager')
    except:
        daemon_started = False

    if daemon_started:
        print("Use DBus proxy")
        bus=dbus.SystemBus()
        proxy = bus.get_object('com.viavi.releasemanager', "/com/viavi/releasemanager")
        sma = dbus.Interface(proxy, dbus_interface='com.viavi.releasemanager')
    else:
        sma = ReleaseManager()

    sma.set_proxy(url_proxy)
    if len(sys.argv) == 2 and sys.argv[1] == "check_new_release":
        retcode = sma.check_new_release()
        print(retcode)
    elif len(sys.argv) == 2 and sys.argv[1] == "get_release_info":
        print(sma.get_release_info())
    elif len(sys.argv) == 2 and sys.argv[1] == "get_last_upgrade_state":
        print(sma.get_last_upgrade_state())
    elif len(sys.argv) == 2 and sys.argv[1] == "get_progress":
        print(sma.get_progress())
    elif len(sys.argv) == 3 and sys.argv[1] == "show_highlighted":
        print(sma.show_highlighted(sys.argv[2]))
    elif len(sys.argv) == 3 and sys.argv[1] == "set_release_monitoring":
        print(sma.set_release_monitoring(sys.argv[2]))
    elif len(sys.argv) == 2 and sys.argv[1] == "set_release_monitoring":
        print(sma.set_release_monitoring(""))
    elif len(sys.argv) == 3 and sys.argv[1] == "show_diff":
        print(sma.show_diff(sys.argv[2]))
    elif len(sys.argv) == 3 and sys.argv[1] == "start_upgrade":
        print(sma.start_upgrade(sys.argv[2]))
    elif len(sys.argv) == 2 and sys.argv[1] == "exit":
        print(sma.exit())
    elif len(sys.argv) == 3 and sys.argv[1] == "check_release":
        ret = sma.check_release(sys.argv[2])
        if ret:
            print("Release Upgradable")
        else:
            print("Release not upgradable")
            retcode = 1
    elif len(sys.argv) == 3 and sys.argv[1] == "set_background_mode":
        print(sma.set_background_mode(sys.argv[2]))
    else:
        print("Usage: \n\t(D: for debug, I: for Isu API, S: for system)")
        print("\tD: %s check_new_release"%sys.argv[0])
        print("\tD: %s accept_new_release"%sys.argv[0])
        print("\tI: %s show_highlighted [local|<url>]"%sys.argv[0])
        print("\tI: %s show_diff <url>"%sys.argv[0])
        print("\tI: %s start_upgrade <url>"%sys.argv[0])
        print("\tI: %s set_release_monitoring <url>"%sys.argv[0])
        print("\tI: %s get_last_upgrade_state"%sys.argv[0])
        print("\tS: %s get_progress"%sys.argv[0])
        print("\tI: %s set_background_mode <0|1>"%sys.argv[0])
        print("\tS: %s daemon"%sys.argv[0])
        print("\tS: %s exit"%sys.argv[0])
    del sma
    exit(retcode)
