#!/usr/bin/env python3

"""
See the help message (--help).
"""

from pycman.config import init_with_config
from time import strftime, localtime
import argparse

try:
  from colorsysplus.text import ColorizedText
except ImportError:
  ColorizedText = None

VERSION_COLOR = (0.0, 1.0, 0.0)
DATE_COLOR = (1.0, 0.0, 1.0)

def get_deps(h):
  deps = {}
  for pkg in h.get_localdb().pkgcache:
    for r in pkg.compute_requiredby():
      try:
        deps[r].add(pkg.name)
      except KeyError:
        deps[r] = set((pkg.name,))
  return deps


def display_dep_chain(name, h, deps, indent='', seen=None, color=False):
  if not seen:
    seen = set()
  seen.add(name)
  pkg = h.get_localdb().get_pkg(name)
  if color and ColorizedText is not None:
    ct = ColorizedText()
    ct.append(None, indent + name)
    ct.append(VERSION_COLOR, ' {}'.format(pkg.version))
    print(ct.to_ansi())
  else:
    print('{}{} {}'.format(indent, name, pkg.version))
  indent += '  '
  try:
    for n in sorted(deps[name]):
      if not n in seen:
        display_dep_chain(n, h, deps, indent, seen=seen, color=color)
  except KeyError:
    pass
  return seen


parser = argparse.ArgumentParser(description='Print all dependencies of the given packages in a tree followed by their installation dates.')
parser.add_argument(
  'pkgs', metavar='<pkgname>', nargs='+',
  help='the packages to check'
)
parser.add_argument(
  '-c', '--config', metavar='<path>', default='/etc/pacman.conf',
  help='Pacman configuration file'
)
parser.add_argument(
  '--color', action='store_true',
  help='Produce colorized output.'
)


def main(args=None):
  pargs = parser.parse_args(args)
  h = init_with_config(pargs.config)
  deps = get_deps(h)
  for n in pargs.pkgs:
    seen = display_dep_chain(n, h, deps, color=pargs.color)
    seen = map(h.get_localdb().get_pkg, seen)
    for d in sorted(seen, key=lambda x: x.installdate):
      timestamp = strftime('[%Y-%m-%d %H:%m]', localtime(d.installdate))
      if pargs.color and ColorizedText is not None:
        ct = ColorizedText()
        ct.append(DATE_COLOR, timestamp)
        ct.append(None, ' {}'.format(d.name))
        ct.append(VERSION_COLOR, ' {}'.format(d.version))
        print(ct.to_ansi())
      else:
        print(timestamp, d.name, d.version)
    print()


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