#! /usr/bin/env python

# Watch line printer queue(s).
# Intended for BSD 4.3 lpq.

import os
import sys
import time

DEF_PRINTER = 'psc'
DEF_DELAY = 10

def main():
    delay = DEF_DELAY # XXX Use getopt() later
    try:
        thisuser = os.environ['LOGNAME']
    except:
        thisuser = os.environ['USER']
    printers = sys.argv[1:]
    if printers:
        # Strip '-P' from printer names just in case
        # the user specified it...
        for i, name in enumerate(printers):
            if name[:2] == '-P':
                printers[i] = name[2:]
    else:
        if 'PRINTER' in os.environ:
            printers = [os.environ['PRINTER']]
        else:
            printers = [DEF_PRINTER]

    clearhome = os.popen('clear', 'r').read()

    while True:
        text = clearhome
        for name in printers:
            text += makestatus(name, thisuser) + '\n'
        print(text)
        time.sleep(delay)

def makestatus(name, thisuser):
    pipe = os.popen('lpq -P' + name + ' 2>&1', 'r')
    lines = []
    users = {}
    aheadbytes = 0
    aheadjobs = 0
    userseen = False
    totalbytes = 0
    totaljobs = 0
    for line in pipe:
        fields = line.split()
        n = len(fields)
        if len(fields) >= 6 and fields[n-1] == 'bytes':
            rank, user, job = fields[0:3]
            files = fields[3:-2]
            bytes = int(fields[n-2])
            if user == thisuser:
                userseen = True
            elif not userseen:
                aheadbytes += bytes
                aheadjobs += 1
            totalbytes += bytes
            totaljobs += 1
            ujobs, ubytes = users.get(user, (0, 0))
            ujobs += 1
            ubytes += bytes
            users[user] = ujobs, ubytes
        else:
            if fields and fields[0] != 'Rank':
                line = line.strip()
                if line == 'no entries':
                    line = name + ': idle'
                elif line[-22:] == ' is ready and printing':
                    line = name
                lines.append(line)

    if totaljobs:
        line = '%d K' % ((totalbytes+1023) // 1024)
        if totaljobs != len(users):
            line += ' (%d jobs)' % totaljobs
        if len(users) == 1:
            line += ' for %s' % next(iter(users))
        else:
            line += ' for %d users' % len(users)
            if userseen:
                if aheadjobs == 0:
                    line += ' (%s first)' % thisuser
                else:
                    line += ' (%d K before %s)' % (
                        (aheadbytes+1023) // 1024, thisuser)
        lines.append(line)

    sts = pipe.close()
    if sts:
        lines.append('lpq exit status %r' % (sts,))
    return ': '.join(lines)

if __name__ == "__main__":
    try:
        main()
    except KeyboardInterrupt:
        pass
