#!/usr/bin/python3

import argparse
import json
import re
import sys

from grove import config as grove_config
from grove import deploy as grove_deploy
from grove import dirs as grove_dirs
from grove import services as grove_services
from grove import util as grove_util

def main():
  parser = argparse.ArgumentParser(description='Check service status.')
  parser.add_argument('--output', type=str, choices=['short', 'long', 'json'], help='output style')
  args = parser.parse_args()

  config = grove_config.load_config()
  homedir = config["homedir"]
  svstagedir = grove_dirs.svstagedir(homedir)
  svdir = config["svdir"]

  # pip (grove version)
  grove_version = None
  pips = grove_util.backtick(['pip3', 'list']).split("\n")
  for pip in pips:
    m = re.match(r'^grove \((.+)\)$', pip)
    if m:
      grove_version = m.group(1)

  # deploy.json
  with open(grove_dirs.deployjson(homedir), 'r') as f:
    deploy_json = json.loads(f.read())

  # Deployed hash
  deployed_hash = grove_deploy.activated_hash(homedir)

  # Runit status
  statuses = grove_util.asyncio_run(grove_services.status(svstagedir, svdir))
  for i in range(0, len(statuses)):
    statuses[i] = statuses[i].replace(svstagedir + "/", "")

  # Pretty-print things
  pretty = {
    "service": "{}/{}".format(deploy_json["yaml"]["name"], deploy_json["type"]),
    "hash": str(deployed_hash),
    "deploy": ", ".join(deploy_json["yaml"]["deploy"]),
    "grove_version": grove_version if grove_version is not None else "[unknown]",
    "status": statuses
  }

  if args.output == 'short' or args.output is None:
    pretty_status = ""
    for status in statuses:
      status = re.sub(r'; \w+: log: .*$', '', status)
      status = re.sub(r'\(pid \d+\) ', '', status)
      if pretty_status != "":
        pretty_status += '; '
      pretty_status += status
    print("{}; {}; {}; grove-{}; {}".format(
      pretty["service"],
      pretty["hash"],
      pretty["deploy"],
      pretty["grove_version"],
      pretty_status
    ))
  elif args.output == 'long':
    print("service: {}".format(pretty["service"]))
    print("hash: {}".format(pretty["hash"]))
    print("deploy: {}".format(pretty["deploy"]))
    print("grove: {}".format(pretty["grove_version"]))
    for status in statuses:
      print(status)
  elif args.output == 'json':
    print(json.dumps(pretty))
  else:
    raise Exception("WTF?!")

  return 0

sys.exit(main())
