<?php

declare(strict_types=1);

namespace Acms\Services\Url;

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

/**
 * Url サービスを DI コンテナに登録する
 *
 * Container エイリアス:
 *   - url                  : UrlResolver（絶対/相対URL変換の主入口）
 *   - url.managed-domain   : ManagedDomainRegistry（管理ドメインの判定・取得。DB 依存を隔離・メモ化）
 *   - url.delivery-rewriter: DeliveryUrlRewriter（メディア配信先URLの書き換え）
 *   - url.uri-object       : UriObjectBuilder（POST された値から acmsLink() 用の URI オブジェクトを組み立てる）
 *
 * 呼び出し例:
 *   $url = App::make('url');
 *   $url->toAbsoluteUrl('/path');
 */
class UrlServiceProvider extends ServiceProvider
{
    /**
     * register service
     *
     * @param \Acms\Services\Container $container
     *
     * @return void
     */
    public function register(Container $container)
    {
        $container->singleton('url.managed-domain', function () {
            return new ManagedDomainRegistry();
        });
        $container->singleton('url.delivery-rewriter', function () use ($container) {
            /** @var ManagedDomainRegistry $managedDomainRegistry */
            $managedDomainRegistry = $container->make('url.managed-domain');
            return new DeliveryUrlRewriter($managedDomainRegistry);
        });
        $container->singleton('url.uri-object', 'Acms\Services\Url\UriObjectBuilder');
        $container->singleton('url', function () use ($container) {
            /** @var DeliveryUrlRewriter $deliveryUrlRewriter */
            $deliveryUrlRewriter = $container->make('url.delivery-rewriter');
            return new UrlResolver($deliveryUrlRewriter);
        });
    }

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