<?php

namespace Livewire\Features;

use Livewire\Livewire;
use Symfony\Component\HttpFoundation\StreamedResponse;
use Symfony\Component\HttpFoundation\BinaryFileResponse;

class SupportActionReturns
{
    static function init() { return new static; }

    protected $returnsByIdAndAction = [];

    function __construct()
    {
        Livewire::listen('action.returned', function ($component, $action, $returned, $id) {
            if (is_array($returned) || is_numeric($returned) || is_bool($returned) || is_string($returned)) {
                if (! isset($this->returnsByIdAndAction[$component->id])) $this->returnsByIdAndAction[$component->id] = [];


                $this->returnsByIdAndAction[$component->id][$id] = $returned;
            }
        });

        Livewire::listen('component.dehydrate.subsequent', function ($component, $response) {
            if (! isset($this->returnsByIdAndAction[$component->id])) return;

            $response->effects['returns'] = $this->returnsByIdAndAction[$component->id];
        });

        Livewire::listen('flush-state', function() {
            $this->returnsByIdAndAction = [];
        });
    }

    function valueIsntAFileResponse($value)
    {
        return ! $value instanceof StreamedResponse
            && ! $value instanceof BinaryFileResponse;
    }

    function captureOutput($callback)
    {
        ob_start();

        $callback();

        return ob_get_clean();
    }
}
