<?php

declare(strict_types=1);

namespace Acms\Services\Setup;

use Acms\Contracts\ServiceProvider;
use Acms\Services\Container;
use Acms\Services\Template\Twig;
use Acms\Services\Template\Twig\TwigOptions;

/**
 * インストーラー/セットアップ領域のサービス登録。
 *
 * 目玉は setup 専用の Twig インスタンス（`template.setup.twig`）。既定の `template.twig` は
 * `AcmsExtension` を内包し、レンダー毎に `getGlobals()` → DB（blog テーブル等）を引くため、
 * DB 未接続の fresh install で失敗する。ここでは AcmsExtension を外し、キャッシュ書込にも依存しない
 * 構成（cacheDir:false）で登録し、setup 全ステップを DB 非依存に描画できるようにする。
 *
 * テンプレートは `ablogcms/setup/templates/` に置き `@setup` 名前空間で参照する。テーマローダを有効にするのは
 * `CustomLoader` を得て `@setup` パスを addPath するため（テーマ階層自体は setup では使わない）。
 */
final class SetupServiceProvider extends ServiceProvider
{
    public function register(Container $container): void
    {
        $container->bind('template.setup.twig', static function (): Twig {
            $twig = new Twig(new TwigOptions(
                // 変数出力は既定でエスケープ（setup 入力値・DB 値を安全に描画）。
                autoescape: 'html',
                // fresh install では cache/ 書込が保証されないため無効化。
                cacheDir: false,
                // AcmsExtension（getGlobals が DB を引く）を外す。include/extends のコメント制御のみ。
                extensions: [TwigOptions::EXTENSION_COMMENTED_INCLUDE],
                markdown: false,
                // CustomLoader を得て @setup パスを addPath するため true。
                useThemeLoader: true,
                useStringLoader: false,
            ));
            // 実行中の setup ディレクトリ配下の templates/ を @setup として登録する。ディレクトリ名は
            // 'setup' 固定ではなく（setup_ 等へリネームして運用されるため）、実行中ディレクトリを
            // 指す SETUP_PATH を基点にする（templates/install の terms_of_service や bin/ の参照と同じ基点）。
            $twig->addTemplatePath(SETUP_PATH . 'templates', 'setup');

            return $twig;
        });
    }
}
