#!/usr/bin/env python3
"""
Fail at archiving most of the time.
"""

import random
import sys
import time

import pscheduler

MAX_SCHEMA = 2

random.seed()

log = pscheduler.Log(quiet=True)


def archive(json):
    """Archive a single result."""

    log.debug("Archiving something.")

    schema = json["data"].get("schema", 1)
    if schema > MAX_SCHEMA:
        return {
            "succeeded": False,
            "error": "Unsupported schema version %d; max is %d" % (
                schema, MAX_SCHEMA)
        }


    # Dawdle if requested

    try:
        delay_iso = json["data"]["delay"]
        duration = pscheduler.iso8601_as_timedelta(delay_iso)
        log.debug("Sleeping %s" % delay_iso)
        time.sleep(pscheduler.timedelta_as_seconds(duration))
    except KeyError:
        pass  # No time to pass


    if random.random() > json["data"].get("fail", 0.5):
        result = {
            "succeeded": True
        }
    else:
        if random.random() < json["data"].get("retry", 0.5):
            result = {
                "succeeded": False,
                "error": "Induced random failure with retry",
                "retry": "PT10S"
            }
        else:
            result = {
                "succeeded": False,
                "error": "Induced random failure, not retrying",
            }

    return result



PARSER = pscheduler.RFC7464Parser(sys.stdin)
EMITTER = pscheduler.RFC7464Emitter(sys.stdout)

for parsed in PARSER:

    # Failing badly means catastrophe.
    if parsed["data"].get("badly", False):
        pscheduler.fail("Forced to fail badly.")

    try:
        EMITTER(archive(parsed))
    except BrokenPipeError as ex:
        log.warning("Broken pipe during archiving; parent must have exited.")
        pscheduler.succeed()

pscheduler.succeed()
