"""

An `Invocation` message is a JSON object with the following properties:

* `type` - A `Number` with the literal value 1, indicating that this message
    is an Invocation.
* `invocationId` - An optional `String` encoding the `Invocation ID`
    for a message.
* `target` - A `String` encoding the `Target` name, as expected by the Callee's
    Binder
* `arguments` - An `Array` containing arguments to apply to the method
    referred to in Target. This is a sequence of JSON `Token`s,
        encoded as indicated below in the "JSON Payload Encoding" section

Example:

```json
{
    "type": 1,
    "invocationId": "123",
    "target": "Send",
    "arguments": [
        42,
        "Test Message"
    ]
}
```
Example (Non-Blocking):

```json
{
    "type": 1,
    "target": "Send",
    "arguments": [
        42,
        "Test Message"
    ]
}
```

"""
from .base_message import BaseHeadersMessage, MessageType


class InvocationMessage(BaseHeadersMessage):
    def __init__(
            self,
            invocation_id,
            target,
            arguments,
            **kwargs):
        super(InvocationMessage, self).__init__(
            MessageType.invocation.value,
            **kwargs)
        self.invocation_id = invocation_id
        self.target = target
        self.arguments = arguments

    def __repr__(self):
        repr_str =\
            "InvocationMessage: invocation_id {0}, target {1}, arguments {2}"
        return repr_str.format(self.invocation_id, self.target, self.arguments)


class InvocationClientStreamMessage(BaseHeadersMessage):
    def __init__(
            self,
            stream_ids,
            target,
            arguments,
            **kwargs):
        super(InvocationClientStreamMessage, self).__init__(1, **kwargs)
        self.target = target
        self.arguments = arguments
        self.stream_ids = stream_ids

    def __repr__(self):
        repr_str =\
            "InvocationMessage: stream_ids {0}, target {1}, arguments {2}"
        return repr_str.format(
            self.stream_ids, self.target, self.arguments)
