"""Plist parser plugin for MacOS install history plist files."""

from plaso.containers import events
from plaso.parsers import plist
from plaso.parsers.plist_plugins import interface


class MacOSInstallHistoryEventData(events.EventData):
    """MacOS install history event data.

    Attributes:
      identifiers (list[str]): identifiers of the installed package.
      name (str): display name of the installed package.
      process_name (str): name of the process that installed the package.
      version (str): display version of the installed package.
      written_time (dfdatetime.DateTimeValues): entry written date and time.
    """

    DATA_TYPE = "macos:install_history:entry"

    def __init__(self):
        """Initializes event data."""
        super().__init__(data_type=self.DATA_TYPE)
        self.identifiers = None
        self.name = None
        self.process_name = None
        self.version = None
        self.written_time = None


class MacOSInstallHistoryPlistPlugin(interface.PlistPlugin):
    """Plist parser plugin for MacOS install history plist files."""

    NAME = "macos_install_history"
    DATA_FORMAT = "MacOS installation history plist file"

    PLIST_PATH_FILTERS = frozenset([interface.PlistPathFilter("InstallHistory.plist")])

    PLIST_KEYS = frozenset(
        ["date", "displayName", "displayVersion", "processName", "packageIdentifiers"]
    )

    # pylint: disable=arguments-differ
    def _ParsePlist(self, parser_mediator, top_level=None, **unused_kwargs):
        """Extracts relevant install history entries.

        Args:
          parser_mediator (ParserMediator): mediates interactions between parsers
              and other components, such as storage and dfVFS.
          top_level (Optional[dict[str, object]]): plist top-level item.
        """
        for plist_key in top_level:
            event_data = MacOSInstallHistoryEventData()
            event_data.identifiers = plist_key.get("packageIdentifiers")
            event_data.name = plist_key.get("displayName")
            event_data.process_name = plist_key.get("processName")
            event_data.version = plist_key.get("displayVersion")
            event_data.written_time = self._GetDateTimeValueFromPlistKey(
                plist_key, "date"
            )

            parser_mediator.ProduceEventData(event_data)


plist.PlistParser.RegisterPlugin(MacOSInstallHistoryPlistPlugin)
