<?php

declare(strict_types=1);

namespace Acms\Services\Response;

use Acms\Contracts\ServiceProvider;
use Acms\Services\Container;

/**
 * Response サービスを DI コンテナに登録する
 *
 * Container エイリアス:
 *   - response               : Emitter（header()/echo/exit の副作用層。Response ファサードの実体）
 *   - response.header-builder: HeaderBuilder（Cache-Control 等ヘッダーの組み立て。純粋関数）
 *   - response.downloader    : FileDownloader（ファイルダウンロード・inline 配信）
 *
 * 呼び出し例:
 *   Response::json($data);
 *   Response::safeHeaders();
 *
 * 拡張ポイント: 独自のセキュリティヘッダー（CSP 等）を足したい拡張アプリは、Emitter の
 * サブクラスを作って 'response' を再登録する（移設前は 'common' に Helper サブクラスを
 * 登録して addSecurityHeader() を差し替える経路だったが、その差し替え先はこちらへ移った）。
 *
 *   $container->singleton('response', function () use ($container) {
 *       return new MyEmitter($container->make('response.header-builder'));
 *   });
 *
 * Emitter 内部のヘッダー付与は $this->addSecurityHeader() の動的ディスパッチなので、
 * サブクラスでのオーバーライドが json() / safeHeaders() / backgroundRedirect() 経由にも効く。
 */
class ResponseServiceProvider extends ServiceProvider
{
    /**
     * register service
     *
     * @param \Acms\Services\Container $container
     *
     * @return void
     */
    public function register(Container $container)
    {
        $container->singleton('response.header-builder', function () {
            return new HeaderBuilder();
        });
        $container->singleton('response', function () use ($container) {
            /** @var HeaderBuilder $headerBuilder */
            $headerBuilder = $container->make('response.header-builder');
            return new Emitter($headerBuilder);
        });
        $container->singleton('response.downloader', function () {
            return new FileDownloader();
        });
    }

    /**
     * initialize service
     *
     * @return void
     */
    public function init()
    {
    }
}
