La classe `BulkGate\Sms\Message` représente l'objet du message SMS, composé du contenu du message et du destinataire.

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

## Destinataire

La classe accepte comme premier argument un numéro de téléphone, qui peut être indiqué sous forme de chaîne :

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

ou une instance de l'objet [`Message\PhoneNumber`](https://www.bulkgate.com/fr/documentation/php-sdk/php-sdk-numero-de-telephone/) :

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

Vous pouvez aussi indiquer le numéro de téléphone après la création de l'instance de l'objet, à l'aide de la méthode `phoneNumber($phone_number, $iso = null)` :

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

$message->phoneNumber('420777777777');  // chaîne
$message->phoneNumber('777777777', BulkGate\Sms\Country::CZECH_REPUBLIC);  // Variante avec ajout de l'indicatif international
$message->phoneNumber(new Message\PhoneNumber('420777777777')); 
```

Pour obtenir le numéro de téléphone, utilisez la méthode `getPhoneNumber()`, qui renvoie toujours une instance de l'objet [`Message\PhoneNumber`](https://www.bulkgate.com/fr/documentation/php-sdk/php-sdk-numero-de-telephone/).

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

## Texte du message 

Le second paramètre est le texte du message. Là aussi, il existe 2 possibilités : indiquer le texte sous forme de chaîne, ou passer une instance de la classe [`Message\Text`](https://www.bulkgate.com/fr/documentation/php-sdk/php-sdk-texte-du-message/).

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

Vous pouvez bien sûr définir le texte même après la création de l'instance de l'objet, à l'aide de la méthode `text($text, array $variables = [])`

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

$message->text('message de test'); // chaîne

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

$message->text(
    'Bonjour <first_name> <last_name>', [
        'first_name' => 'John', 
        'last_name' => 'Doe'
    ]); // remplissage des variables ; le texte obtenu est "Bonjour John Doe"
```

Pour récupérer le texte du message, utilisez la méthode `getText()`, qui renvoie toujours une instance de l'objet [`Message\Text`](https://www.bulkgate.com/fr/documentation/php-sdk/php-sdk-texte-du-message/).

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

## Prise en charge de JSON

L'objet `BulkGate\Sms\Message` implémente l'interface [`\JsonSerializable`](http://php.net/manual/en/class.jsonserializable.php), qui permet de le convertir au format JSON via [`json_encode()`](http://php.net/manual/en/function.json-encode.php).

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

echo json_encode($message);
```

Le résultat est :

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

Les clés `status`, `price`, `credit` et `id` ne sont renseignées qu'après l'envoi,
`scheduled` dès que vous appelez `schedule()`.

## Conversion en chaîne

L'objet `BulkGate\Sms\Message` implémente la méthode magique [`__string()`](http://php.net/manual/en/language.oop5.magic.php#object.tostring)

```php
/** @var BulkGate\Sms\Message $message */
$message = (string) $message; // dans la variable
echo $message; // vers la sortie
```

Le résultat est :

```
420777777777: message de test
```

## Conversion en tableau

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

## Interface fluide

L'[interface fluide](https://en.wikipedia.org/wiki/Fluent_interface) (fluent interface) est une technique de chaînage des méthodes.

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

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

## Informations après l'envoi

Une fois le message envoyé, vous pouvez en obtenir le prix, le statut et l'ID.

```php
$id = $message->getId();  // ID du message
$status = $message->getStatus(); // statut
$price = $message->getPrice(); // prix
$credit = $message->getCredit(); // solde de crédit après l'envoi
```

## Planification du message

La méthode `schedule()` définit l'heure d'envoi sous forme de timestamp Unix. Sans
paramètre, elle annule la planification.

```php
$message->schedule(strtotime('2026-01-15 09:00')); // planifier
$message->schedule(); // annuler la planification
```
