
# Modèles de workflow

Les modèles de workflow permettent de définir une seule fois la structure des étapes d’un workflow, puis de le lancer plusieurs fois par son nom. C’est utile lorsqu’un même processus en plusieurs étapes doit s’exécuter avec différentes charges utiles.

## Définir un modèle

Utilisez `Queuety::define_workflow()` pour créer le modèle, puis enregistrez-le :

```php
use Queuety\Queuety;
use Queuety\Enums\Priority;

$builder = Queuety::define_workflow( 'onboarding' )
    ->on_queue( 'pipelines' )
    ->with_priority( Priority::Normal )
    ->max_attempts( 5 )
    ->then( CreateAccountHandler::class )
    ->then( SendWelcomeEmailHandler::class )
    ->then( NotifyAdminHandler::class );

Queuety::register_workflow_template( $builder );
```

Enregistrez les modèles tôt, par exemple dans le hook d’initialisation d’une extension :

```php
add_action( 'init', function () {
    $builder = Queuety::define_workflow( 'onboarding' )
        ->then( CreateAccountHandler::class )
        ->then( SendWelcomeEmailHandler::class )
        ->then( NotifyAdminHandler::class );

    Queuety::register_workflow_template( $builder );
} );
```

## Exécuter un modèle

Lancez un modèle enregistré par son nom avec `Queuety::run_workflow()` :

```php
$workflow_id = Queuety::run_workflow( 'onboarding', [ 'email' => 'user@example.com' ] );
```

Le deuxième argument est la charge utile ou l’état initial, comme pour `->dispatch()` sur un générateur. L’entier renvoyé correspond à l’identifiant du workflow.

Si le modèle n’est pas enregistré, une exception `RuntimeException` est levée.

## Lister les modèles enregistrés

Accédez au registre des modèles :

```php
$registry = Queuety::workflow_templates();
$template = $registry->get( 'onboarding' ); // WorkflowTemplate or null
```

## Exemple complet

```php
// Register templates on init.
add_action( 'init', function () {
    // User onboarding pipeline
    $onboarding = Queuety::define_workflow( 'onboarding' )
        ->on_queue( 'users' )
        ->then( CreateAccountHandler::class )
        ->then( SetupDefaultsHandler::class )
        ->then( SendWelcomeEmailHandler::class );
    Queuety::register_workflow_template( $onboarding );

    // Content generation pipeline
    $content = Queuety::define_workflow( 'generate_content' )
        ->on_queue( 'llm' )
        ->max_attempts( 5 )
        ->then( BuildPromptHandler::class )
        ->then( CallLLMHandler::class )
        ->then( ReviewOutputHandler::class )
        ->then( PublishHandler::class );
    Queuety::register_workflow_template( $content );
} );

// Dispatch them anywhere in your application.
$wf1 = Queuety::run_workflow( 'onboarding', [ 'email' => 'alice@example.com' ] );
$wf2 = Queuety::run_workflow( 'generate_content', [ 'topic' => 'WordPress performance' ] );
```

## Modèles et workflows intégrés

| | Workflow intégré | Modèle |
|---|---|---|
| Définition | Au moment du lancement | Une fois, au moment de l’enregistrement |
| Lancement | `Queuety::workflow('name')->then(...)->dispatch()` | `Queuety::run_workflow('name', $payload)` |
| Réutilisation | Construire la chaîne à chaque fois | Enregistrer une fois et lancer plusieurs fois |
| Idéal pour | Workflows ponctuels ou composés dynamiquement | Processus standard et répétables |
