"""Value types that can be used in an event filter."""

from dfdatetime import posix_time as dfdatetime_posix_time


class DateTimeValueType(dfdatetime_posix_time.PosixTimeInMicroseconds):
  """Value type to represent a date and time value."""

  def __init__(self, value):
    """Initializes a date and time value type.

    Args:
      value (int:str): a POSIX timestamp in microseconds or an ISO 8601 date
          and time string.

    Raises:
      ValueError: if the value cannot be copied to a date and time object.
    """
    if isinstance(value, int):
      timestamp = value
    else:
      try:
        timestamp = int(value, 10)
      except (TypeError, ValueError):
        timestamp = None

    super().__init__(timestamp=timestamp)

    if timestamp is None:
      try:
        # Adjust the ISO 8601 date and time string so is resembles a Python
        # date and time string.
        if value and len(value) > 10 and value[10] == 'T':
          value = ' '.join(value.split('T'))

        self.CopyFromDateTimeString(value)
      except (TypeError, ValueError):
        raise ValueError(f'Unsupported date time string value: {value!s}')
