<?php

namespace Acms\Services\SiteSeed;

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

/**
 * SiteSeed サービスを DI コンテナに登録する
 *
 * Facade は作らず、呼び出し側は `Application::make('site.seed')` で取得する。
 */
class SiteSeedServiceProvider extends ServiceProvider
{
    public function register(Container $container)
    {
        $container->singleton('site.seed', function () {
            return new SiteSeeder(
                new SiteSeedPathResolver($this->defaultBinRoot()),
                SiteSeedDestination::fromScriptDir(),
            );
        });
    }

    public function init()
    {
    }

    /**
     * デフォルトの bin ディレクトリを解決する
     *
     * setup ディレクトリ名は配布時は `setup` だが、インストーラの最終ステップ
     * (`Install_Step_6`) で任意の名前にリネームされる仕様がある。リネーム後でも
     * bin/yaml インポートが動くように、3 段階でディレクトリを解決する。
     *
     *   1. `SETUP_DIR` 定数 — setup/import.php 等から呼ばれた場合に定義済み。
     *      リネーム後の実際のディレクトリ名が入っている。
     *   2. 自動探索 — `ablogcms/<dir>/setup.php` を glob で探して、ヒットした
     *      ディレクトリの bin/ を採用する。Installer など SETUP_DIR が無い
     *      コンテキストでも、リネーム後の setup ディレクトリを自動で見つけられる。
     *   3. フォールバック — リネーム前の標準パス `setup/bin/`。
     *
     * 前提: 配布物の中で `setup.php` を直下に持つディレクトリは setup 専用 (リネーム
     * 後を含む) のみ、という規約に依存している。
     */
    private function defaultBinRoot(): string
    {
        $ablogcmsRoot = dirname(__DIR__, 3);

        if (defined('SETUP_DIR') && SETUP_DIR !== '') {
            $candidate = $ablogcmsRoot . '/' . trim(SETUP_DIR, '/') . '/bin/';
            if (LocalStorage::isDirectory($candidate)) {
                return $candidate;
            }
        }

        // 配布物直下の各ディレクトリを走査し、直下に setup.php を持つもの（＝リネーム後を含む
        // setup ディレクトリ）の bin/ を採用する。
        foreach (LocalStorage::getDirectoryList($ablogcmsRoot) as $dir) {
            if (!LocalStorage::isFile($dir . '/setup.php')) {
                continue;
            }
            $candidate = $dir . '/bin/';
            if (LocalStorage::isDirectory($candidate)) {
                return $candidate;
            }
        }

        return $ablogcmsRoot . '/setup/bin/';
    }
}
