La clase `BulkGate\Sms\Message` representa el objeto del mensaje SMS, que consta del contenido del mensaje y del destinatario.

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

## Destinatario

Como primer argumento, la clase acepta un número de teléfono que puede indicarse mediante una cadena:

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

o acepta una instancia del objeto [`Message\PhoneNumber`](https://www.bulkgate.com/es/documentacion/php-sdk/php-sdk-numero-de-telefono/):

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

También puede indicar el número de teléfono después de crear la instancia del objeto mediante el método `phoneNumber($phone_number, $iso = null)`:

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

$message->phoneNumber('420777777777');  // cadena
$message->phoneNumber('777777777', BulkGate\Sms\Country::CZECH_REPUBLIC);  // Variante que completa el prefijo internacional
$message->phoneNumber(new Message\PhoneNumber('420777777777')); 
```

Para obtener el número de teléfono puede utilizar el método `getPhoneNumber()`, que siempre devuelve una instancia del objeto [`Message\PhoneNumber`](https://www.bulkgate.com/es/documentacion/php-sdk/php-sdk-numero-de-telefono/).

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

## Texto del mensaje 

El segundo parámetro es el texto del mensaje. También aquí hay 2 opciones: la primera es indicar el texto mediante una cadena y la otra, una instancia de la clase [`Message\Text`](https://www.bulkgate.com/es/documentacion/php-sdk/php-sdk-texto-del-mensaje/).

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

Por supuesto, también puede definir el texto después de crear la instancia del objeto mediante el método `text($text, array $variables = [])`

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

$message->text('mensaje de prueba'); // cadena

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

$message->text(
    'Hola <first_name> <last_name>', [
        'first_name' => 'Juan', 
        'last_name' => 'García'
    ]); // rellenado de variables; el texto resultante es "Hola Juan García"
```

Para obtener el texto del mensaje puede utilizar el método `getText()`, que siempre devuelve una instancia del objeto [`Message\Text`](https://www.bulkgate.com/es/documentacion/php-sdk/php-sdk-texto-del-mensaje/).

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

## Compatibilidad con JSON

El objeto `BulkGate\Sms\Message` implementa la interfaz [`\JsonSerializable`](http://php.net/manual/en/class.jsonserializable.php), que permite convertirlo a formato JSON mediante [`json_encode()`](http://php.net/manual/en/function.json-encode.php).

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

echo json_encode($message);
```

La salida es:

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

Las claves `status`, `price`, `credit` e `id` solo se rellenan tras el envío, y
`scheduled`, en cuanto llama a `schedule()`.

## Conversión a cadena

El objeto `BulkGate\Sms\Message` implementa el 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; // en la variable
echo $message; // a la salida
```

La salida es:

```
420777777777: mensaje de prueba
```

## Conversión a array

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

## Fluent interface

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

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

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

## Información tras el envío

Una vez enviado el mensaje, puede obtener de él el precio, el estado y el id del mensaje.

```php
$id = $message->getId();  // id del mensaje
$status = $message->getStatus(); // estado
$price = $message->getPrice(); // precio
$credit = $message->getCredit(); // saldo de crédito tras el envío
```

## Programación del mensaje

El método `schedule()` establece la hora de envío como Unix timestamp. Sin
parámetro, cancela la programación.

```php
$message->schedule(strtotime('2026-01-15 09:00')); // programar
$message->schedule(); // cancelar la programación
```
