#!/usr/bin/python

import dbus, flimflam, sys

flim = flimflam.FlimFlam(dbus.SystemBus())

if len(sys.argv) < 2:
    print "Usage: %s <command>" % (sys.argv[0])
    print "  create <profile>"
    print "  list"
    print "  name <profile> [name]"
    print "  pop [<profile>]"
    print "  push <profile>"
    print "  remove <profile>"
    print ""
    print "where <profile> is of the form ident or ~user/ident"
    print "(beware that ~user may need shell quoting)"
    sys.exit(1)


def print_profiles():
    active = flim.GetActiveProfile()
    for profile in flim.GetObjectList("Profile"):
        if profile.object_path == active.object_path:
            isactive = "*"
        else:
            isactive = " "

        # TODO(sleffler) handler ~user paths
        identifier = profile.object_path[profile.object_path.rfind("/") + 1:]

        properties = profile.GetProperties(utf8_strings = True)
        name = properties.get("Name", "<unnamed>");

        print "%s %-12s %s" % (isactive, identifier, name)

if sys.argv[1] in ["list", "show"]:
    print_profiles()

elif sys.argv[1] in ["name"]:
    if (len(sys.argv) < 3):
        print "Need at least profile parameter"
        sys.exit(1)

    profile = flim.FindElementByNameSubstring('Profile', sys.argv[2])
    if (len(sys.argv) > 3):
        profile.SetProperty("Name", sys.argv[3]);
    else:
        properties = profile.GetProperties(utf8_strings = True)
        print "%s" % properties.get("Name", "<unnamed>")

elif sys.argv[1] in ["create"]:
    if (len(sys.argv) < 3):
        print "Profile identifier required"
        sys.exit(1)

    flim = flimflam.FlimFlam(dbus.SystemBus())
    profile = flim.CreateProfile(sys.argv[2])
    print "Created profile %s" % (profile.object_path)

elif sys.argv[1] in ["remove"]:
    if (len(sys.argv) < 3):
        print "Profile identifier required"
        sys.exit(1)

    flim = flimflam.FlimFlam(dbus.SystemBus())
    flim.RemoveProfile(sys.argv[2])
    print "Removed profile %s" % (sys.argv[2])

elif sys.argv[1] in ["push"]:
    if (len(sys.argv) < 3):
        print "Profile identifier required"
        sys.exit(1)

    flim = flimflam.FlimFlam(dbus.SystemBus())
    profile = flim.PushProfile(sys.argv[2])
    print "Pushed profile %s" % (profile.object_path)

elif sys.argv[1] in ["pop"]:
    if (len(sys.argv) == 3):
        flim.PopProfile(sys.argv[2])
    else:
        flim.PopAnyProfile()

else:
    print "Unknown command"
