import json

from boxsdk.object.base_object import BaseObject
from ..util.api_call_decorator import api_call


class Comment(BaseObject):
    """An object that represents a comment on an item"""
    _item_type = 'comment'

    @staticmethod
    def construct_params_from_message(message: str) -> dict:
        message_type = 'tagged_message' if '@[' in message else 'message'
        return {
            message_type: message
        }

    @api_call
    def reply(self, message: str) -> 'Comment':
        """
        Add a reply to the comment.

        :param message:
            The content of the reply comment.
        """
        url = self.get_type_url()
        data = self.construct_params_from_message(message)
        data['item'] = {
            'type': 'comment',
            'id': self.object_id
        }
        box_response = self._session.post(url, data=json.dumps(data))
        response = box_response.json()
        return self.translator.translate(
            session=self._session,
            response_object=response,
        )

    @api_call
    def edit(self, message: str) -> 'Comment':
        """
        Edit the message of the comment.

        :param message:
            The content of the reply comment.
        """
        data = self.construct_params_from_message(message)
        return self.update_info(data=data)
