A classe `BulkGate\Sms\Message` representa o objeto da mensagem SMS, composto pelo conteúdo da mensagem e pelo destinatário.

```php
use BulkGate\Sms\Message;
```

## Destinatário

Como primeiro argumento, a classe aceita um número de telefone, que pode ser indicado como string:

```php
$message = new Message('420777777777', 'mensagem de teste');
```

ou aceita uma instância do objeto [`Message\PhoneNumber`](https://www.bulkgate.com/pt/documentacao/php-sdk/php-sdk-numero-de-telefone/):

```php
$message = new Sms\Message(new Message\PhoneNumber('420777777777'), 'mensagem de teste');
```

O número de telefone também pode ser indicado depois de criar a instância do objeto, através do método `phoneNumber($phone_number, $iso = null)`:

```php
$message = new Sms\Message();

$message->phoneNumber('420777777777');  // string
$message->phoneNumber('777777777', BulkGate\Sms\Country::CZECH_REPUBLIC);  // Opção com o preenchimento do indicativo internacional
$message->phoneNumber(new Message\PhoneNumber('420777777777')); 
```

Para obter o número de telefone, pode utilizar o método `getPhoneNumber()`, que devolve sempre uma instância do objeto [`Message\PhoneNumber`](https://www.bulkgate.com/pt/documentacao/php-sdk/php-sdk-numero-de-telefone/).

```php
/** @var Message\PhoneNumber $phone_number */
$phone_number = $message->getPhoneNumber();
```

## Texto da mensagem 

O segundo parâmetro é o texto da mensagem. Também aqui existem 2 opções: a primeira é indicar o texto como string, a segunda é uma instância da classe [`Message\Text`](https://www.bulkgate.com/pt/documentacao/php-sdk/php-sdk-texto-da-mensagem/).

```php
$message = new Message(
        new Message\PhoneNumber('420777777777'), 
        new Message\Text('mensagem de teste')
);
```

Naturalmente, também pode definir o texto depois de criar a instância do objeto, através do método `text($text, array $variables = [])`

```php
$message = new Sms\Message();
$message->phoneNumber('420777777777');  // string

$message->text('mensagem de teste'); // string

$message->text(new Message\Text('mensagem de teste')); 

$message->text(
    'Olá <first_name> <last_name>', [
        'first_name' => 'João', 
        'last_name' => 'Silva'
    ]); // preenchimento das variáveis; o resultado é "Olá João Silva"
```

Para obter o texto da mensagem, pode utilizar o método `getText()`, que devolve sempre uma instância do objeto [`Message\Text`](https://www.bulkgate.com/pt/documentacao/php-sdk/php-sdk-texto-da-mensagem/).

```php
/** @var Message\Text $text */
$text = $message->getText();
```

## Suporte de JSON

O objeto `BulkGate\Sms\Message` implementa a interface [`\JsonSerializable`](http://php.net/manual/en/class.jsonserializable.php), que permite convertê-lo para o formato JSON através de [`json_encode()`](http://php.net/manual/en/function.json-encode.php).

```php
/** @var BulkGate\Sms\Message $message */
$message = new Message('420777777777', 'mensagem de teste');

echo json_encode($message);
```

O resultado é:

```json
{
  "number": {
    "number": "420777777777",
    "iso": null
  },
  "text": "mensagem de teste",
  "status": "preparation",
  "price": 0.0,
  "credit": 0.0,
  "id": null,
  "scheduled": null
}
```

As chaves `status`, `price`, `credit` e `id` só são preenchidas após o envio,
`scheduled` depois de chamar `schedule()`.

## Conversão para string

O objeto `BulkGate\Sms\Message` implementa o método mágico [`__string()`](http://php.net/manual/en/language.oop5.magic.php#object.tostring)

```php
/** @var BulkGate\Sms\Message $message */
$message = (string) $message; // para a variável
echo $message; // para a saída
```

O resultado é:

```
420777777777: mensagem de teste
```

## Conversão para array

```php
/** @var BulkGate\Sms\Message $message */
$array = $message->toArray();
```

## Fluent interface

[Fluent interface](https://en.wikipedia.org/wiki/Fluent_interface) é a técnica de encadeamento de métodos.

```php
$message = new Sms\Message();

$message->phoneNumber('420777777777')
        ->text('mensagem de teste');
```

## Informações após o envio

Depois de enviar a mensagem, pode obter dela o preço, o estado e o id da mensagem.

```php
$id = $message->getId();  // id da mensagem
$status = $message->getStatus(); // estado
$price = $message->getPrice(); // preço
$credit = $message->getCredit(); // saldo de crédito após o envio
```

## Agendamento da mensagem

O método `schedule()` define a hora de envio como Unix timestamp. Sem
parâmetro, cancela o agendamento.

```php
$message->schedule(strtotime('2026-01-15 09:00')); // agendar
$message->schedule(); // cancelar o agendamento
```
