"""Output module that saves data into a JSON format."""

import json

from plaso.output import manager
from plaso.output import shared_json


class JSONOutputModule(shared_json.SharedJSONOutputModule):
  """Output module for the JSON format."""

  NAME = 'json'
  DESCRIPTION = 'Saves the events into a JSON format.'

  def __init__(self):
    """Initializes an output module."""
    super().__init__()
    self._event_counter = 0

  def WriteFieldValues(self, output_mediator, field_values):
    """Writes field values to the output.

    Args:
      output_mediator (OutputMediator): mediates interactions between output
          modules and other components, such as storage and dfVFS.
      field_values (dict[str, str]): output field values per name.
    """
    if self._event_counter != 0:
      self.WriteText(', ')

    json_string = json.dumps(field_values, sort_keys=True)
    output_text = f'"event_{self._event_counter:d}": {json_string:s}\n'
    self.WriteText(output_text)

    self._event_counter += 1

  def WriteFooter(self):
    """Writes the footer to the output."""
    self.WriteText('}')

  def WriteHeader(self, output_mediator):
    """Writes the header to the output.

    Args:
      output_mediator (OutputMediator): mediates interactions between output
          modules and other components, such as storage and dfVFS.
    """
    self.WriteText('{')
    self._event_counter = 0


manager.OutputManager.RegisterOutput(JSONOutputModule)
