"""Bencode parser plugin for Transmission BitTorrent files."""

from plaso.containers import events
from plaso.parsers import bencode_parser
from plaso.parsers.bencode_plugins import interface


class TransmissionEventData(events.EventData):
    """Transmission BitTorrent event data.

    Attributes:
      added_time (dfdatetime.DateTimeValues): date and time the torrent was
          added to Transmission.
      destination (str): path of the downloaded file.
      downloaded_time (dfdatetime.DateTimeValues): date and time the content
          was downloaded.
      last_activity_time (dfdatetime.DateTimeValues): date and time of the last
          download activity.
      seedtime (int): client seed time in number of minutes.
    """

    DATA_TYPE = "p2p:bittorrent:transmission"

    def __init__(self):
        """Initializes event data."""
        super().__init__(data_type=self.DATA_TYPE)
        self.added_time = None
        self.destination = None
        self.downloaded_time = None
        self.last_activity_time = None
        self.seedtime = None


class TransmissionBencodePlugin(interface.BencodePlugin):
    """Parse Transmission BitTorrent activity file for current torrents.

    Transmission stores an individual Bencoded file for each active download in a folder
    named resume under the user's application data folder.
    """

    NAME = "bencode_transmission"
    DATA_FORMAT = "Transmission BitTorrent activity file"

    _BENCODE_KEYS = frozenset(
        [
            "activity-date",
            "added-date",
            "destination",
            "done-date",
            "seeding-time-seconds",
        ]
    )

    def Process(self, parser_mediator, bencode_file=None, **kwargs):
        """Extracts events from a Transmission's resume folder file.

        Args:
          parser_mediator (ParserMediator): mediates interactions between parsers
              and other components, such as storage and dfVFS.
          bencode_file (Optional[BencodeFile]): bencode file.
        """
        # This will raise if unhandled keyword arguments are passed.
        super().Process(parser_mediator, **kwargs)

        root_values = bencode_file.GetValues()

        seeding_time = root_values.GetDecodedValue("seeding-time-seconds")

        event_data = TransmissionEventData()
        event_data.added_time = root_values.GetDateTimeValue("added-date")
        event_data.destination = root_values.GetDecodedValue("destination")
        event_data.downloaded_time = root_values.GetDateTimeValue("done-date")
        event_data.last_activity_time = root_values.GetDateTimeValue("activity-date")
        # Convert seconds to minutes.
        event_data.seedtime, _ = divmod(seeding_time, 60)

        parser_mediator.ProduceEventData(event_data)


bencode_parser.BencodeParser.RegisterPlugin(TransmissionBencodePlugin)
