<?php

declare(strict_types=1);

namespace Acms\Services\Crypto;

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

/**
 * Crypto サービスを DI コンテナに登録する
 *
 * Container エイリアス:
 *   - crypto        : Encrypter（AES(CBC) 暗復号。鍵は crypto.salt のアプリ固定ソルトから導出）
 *   - crypto.salt   : SaltRepository（アプリ全体のソルト管理。DB 永続化・ローテーション）
 *   - crypto.random : RandomGenerator（暗号論的疑似乱数によるパスワード生成）
 *
 * 呼び出し例:
 *   $encrypter = App::make('crypto');
 *   $encrypter->encrypt($value, $iv);
 */
class CryptoServiceProvider extends ServiceProvider
{
    /**
     * register service
     *
     * @param \Acms\Services\Container $container
     *
     * @return void
     */
    public function register(Container $container)
    {
        $container->singleton('crypto.salt', function () {
            return new SaltRepository();
        });
        $container->singleton('crypto.random', function () {
            return new RandomGenerator();
        });
        $container->singleton('crypto', function () use ($container) {
            /** @var SaltRepository $saltRepository */
            $saltRepository = $container->make('crypto.salt');
            return new Encrypter($saltRepository);
        });
    }

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