#!/usr/bin/env python3
# -*- coding: utf-8 -*-

'''
This script reads the logs of a job's clients to determine its state and write a complete log.
'''

import argparse
import datetime
import os

from hateno.utils import jsonfiles

def addArguments(parser):
	parser.add_argument('--dead-delay', type = float, default = 10, help = 'delay in seconds after which a job should be considered dead')
	parser.add_argument('job_dir', type = str, help = 'path to the job directory where the logs are stored')
	parser.add_argument('log', type = str, help = 'path to the log file to write')

def main(args):
	log = []
	clients = 0
	dead = 0

	if os.path.isdir(args.job_dir):
		current_time = datetime.datetime.now()

		for client, state_file in ((os.path.splitext(entry.name)[0], entry.path) for entry in os.scandir(args.job_dir) if entry.name.endswith('.state')):
			state = jsonfiles.readRetry(state_file)
			clients += 1

			# If the state is empty, the client is not working yet so there is no log to read

			if state:
				try:
					log += jsonfiles.readRetry(os.path.join(args.job_dir, f'{client}.json'))

				except FileNotFoundError:
					pass

				if (current_time - datetime.datetime.fromisoformat(state['datetime'])).total_seconds() > args.dead_delay:
					dead += 1

	jsonfiles.write({
		'clients': {
			'total': clients,
			'dead': dead
		},
		'log': log
	}, args.log)

if __name__ == '__main__':
	parser = argparse.ArgumentParser(description = 'Get the state of a job')
	addArguments(parser)
	main(parser.parse_args())
