#!/usr/bin/env python3
"""Custom input type parser."""

from argparse import ArgumentTypeError

import dateparser
import environs

env = environs.Env()


def timedelta_validator(value):
    """
    Return the dateparser string for a time in the past.

    :param value: a string containing a time format supported by
    mod:`dateparser`
    """
    if value is None:
        return None

    if not dateparser.parse(value):
        raise ArgumentTypeError(f"'{value}' is not a valid timedelta string")

    return value


def timedelta(value, dt_format=None):
    """
    Return the :class:`datetime.datetime.DateTime` for a time in the past.

    :param value: a string containing a time format supported by
    mod:`dateparser`
    """
    if value is None:
        return None

    timedelta = dateparser.parse(
        value, settings={
            "TO_TIMEZONE": "UTC",
            "RETURN_AS_TIMEZONE_AWARE": True
        }
    )

    if dt_format:
        timedelta = timedelta.strftime(dt_format)

    return timedelta


@env.parser_for("timedelta_validator")
def timedelta_parser(value):
    try:
        timedelta_validator(value)
        return value
    except ArgumentTypeError as e:
        raise environs.EnvError(e) from e
