<?php

namespace Wrm\Events\Tests;

use GuzzleHttp\Client;
use GuzzleHttp\Handler\MockHandler;
use GuzzleHttp\HandlerStack;
use GuzzleHttp\Middleware;
use GuzzleHttp\Psr7\Response;

/**
 * Must only be used within tests.
 */
class ClientFactory
{
    /**
     * Use this to create a new client which will return provided responses.
     *
     * You can use the $historyContainer to assert actual requests afterwards,
     * e.g. assert that urls or headers match.
     *
     * @see https://susi.dev/mock-http-api-responses-with-guzzle-psr-18-psr-7/
     *
     * @param Response[] $responses
     * @param array{'request': Request, 'response': Response, 'error': null}[] $historyContainer
     */
    public static function createClientWithHistory(
        array $responses,
        array &$historyContainer
    ): Client {
        $history = Middleware::history($historyContainer);

        $handlerStack = HandlerStack::create(new MockHandler($responses));
        $handlerStack->push($history);

        return new Client(['handler' => $handlerStack]);
    }
}