#!/usr/bin/python3

# sessiond - standalone X session manager
# Copyright (C) 2020 James Reed
#
# 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, see <https://www.gnu.org/licenses/>.

import sys
from argparse import ArgumentParser
from subprocess import run

from dbus.exceptions import DBusException
from sessiond import Session


def get_inhibitors(session):
    # Sort by timestamp.
    inh = sorted(session.list_inhibitors().items(), key=lambda x: x[1][0], reverse=True)
    if len(inh) == 0:
        sys.stderr.write("No inhibitors\n")
        sys.exit(1)
    return inh


if __name__ == "__main__":
    p = ArgumentParser(description="With no command, list running inhibitors.")
    p.add_argument("command", nargs="?", help="Command to run")
    p.add_argument("-w", "--who", default="", help="Set who is inhibiting")
    p.add_argument("-y", "--why", default="", help="Set why this inhibitor is running")
    p.add_argument("-s", "--stop", action="store_true", help="Stop running inhibitors")
    p.add_argument(
        "-i", "--inhibit", action="store_true", help="Inhibit without a command"
    )
    p.add_argument(
        "-u",
        "--uninhibit",
        nargs="?",
        const=True,
        metavar="ID",
        help="Uninhibit last inhibitor or by ID",
    )

    args = p.parse_args()
    s = Session()

    if args.stop:
        n = s.stop_inhibitors()
        if n == 0:
            sys.exit(1)
    elif args.inhibit:
        print(s.inhibit(args.who, args.why))
    elif args.uninhibit:
        if args.uninhibit is True:
            # Uninhibit by first ID.
            args.uninhibit = get_inhibitors(s)[0][0]
        s.uninhibit(args.uninhibit)
        print(args.uninhibit)
    elif args.command:
        i = s.inhibit(args.who or args.command, args.why)

        def try_uninhibit():
            try:
                s.uninhibit(i)
            except DBusException:
                pass

        try:
            run(args.command, shell=True)
        except KeyboardInterrupt:
            try_uninhibit()
            sys.exit(130)
        try_uninhibit()
    else:
        for (k, t) in get_inhibitors(s):
            out = "id='{}' time='{}' who='{}'".format(k, t[0], t[1])
            if t[2]:
                out += " why='{}'".format(t[2])
            print(out)
