class Payload:
    def __init__(self, payload):
        self._payload = SCPayload()
        self._payload.ParseFromString(payload)

    @staticmethod
    def from_bytes(payload):
        return Payload(payload=payload)

    @property
    def action(self):
        return self._payload.action

    @property
    def timestamp(self):
        return self._payload.timestamp

    @property
    def data(self):
        if self.action == SCPayload.CREATE_AGENT:
            return self._payload.create_agent
        if self.action == SCPayload.CREATE_PACKAGE:
            return self._payload.create_package
        if self.action == SCPayload.UPDATE_PACKAGE:
            return self._payload.update_package
        if self.action == SCPayload.CREATE_REPLANTATION:
            return self._payload.create_replantation
    def get_blockchain_details(self, obj):
        if obj.blockchain_batch_id:
            request = self.context['request']
            http = 'https' if request.is_secure() else 'http'
            r = requests.get(
                f"{http}://{os.environ.get('API_HOST')}:{os.environ.get('API_PORT')}/batches/{obj.blockchain_batch_id}"
            )
            try:
                transaction = r.json()['data']['transactions'][0]
                payload = base64.b64decode(transaction['payload'])
                try:
                    t = SCPayload()
                    t.ParseFromString(payload)
                    payload = str(t).replace('\n', '</br>')
                    if t.timestamp:
                        readable_timestamp = self.parse_timestamp_to_str_datetime(
                            t.timestamp)
                        payload = payload.replace(str(t.timestamp),
                                                  readable_timestamp)
                    transaction['payload'] = payload
                except DecodeError:
                    transaction['payload'] = 'System transaction'
            except (KeyError, IndexError):
                transaction = {}

            return transaction
        return {}