<?php

namespace Acms\Plugins\SamplePlugin;

use ACMS_App;
use Acms\Services\Common\CorrectorFactory;
use Acms\Services\Common\HookFactory;
use Acms\Services\Common\InjectTemplate;
use Acms\Services\Common\ValidatorFactory;
use Acms\Services\Facades\Application;
use Acms\Services\Facades\Twig;

class ServiceProvider extends ACMS_App
{
    /**
     * @var string
     */
    public $version = '1.0.0';

    /**
     * @var string
     */
    public $name = 'SamplePlugin';

    /**
     * @var string
     */
    public $author = 'com.appleple';

    /**
     * @var bool
     */
    public $module = false;

    /**
     * @var false|string
     */
    public $menu = 'sample_index';

    /**
     * @var string
     */
    public $desc = 'サンプルのプラグインです。';

    /**
     * サービスの初期処理
     */
    public function init()
    {
        $hook = HookFactory::singleton();
        $hook->attach('SampleHook', new Hook());

        $corrector = CorrectorFactory::singleton();
        $corrector->attach('SampleCorrector', new Corrector());

        $validator = ValidatorFactory::singleton();
        $validator->attach('SampleValidator', new Validator());

        $inject = InjectTemplate::singleton();
        $inject->add('admin-module-select', PLUGIN_DIR . 'SamplePlugin/template/module-select.html');
        $inject->add('admin-module-config-Sample', PLUGIN_DIR . 'SamplePlugin/template/config.html');

        // Twig テンプレートディレクトリの登録
        Twig::addTemplatePath(PLUGIN_LIB_DIR . 'SamplePlugin/template', 'sample');

        // サービス差し替え・デコレーション。
        // ここ（ServiceProvider::init()）が override() / extend() を登録する標準的なタイミング。
        $container = Application::getInstance();
        // 例1: 前後処理だけ差し込みたい場合は extend() で既存実装をラップする
        // $container->extend('markdown', function ($inner) {
        //     return new SampleMarkdownLogger($inner); // $inner への委譲を必ず残すこと
        // }, ['owner' => 'Acms\\Plugins\\SamplePlugin', 'priority' => 10]);
        // 例2: 実装ごと丸ごと差し替えたい場合は override() を使う
        // $container->override('markdown', SampleMarkdownConverter::class, [
        //     'owner' => 'Acms\\Plugins\\SamplePlugin',
        // ]);

        if (defined('ADMIN') && ADMIN === 'app_' . $this->menu) {
            // Twig で書いた設定画面を同じ差し込みポイントに追加する。callable を渡すと、
            // ACMS_GET_Admin_InjectTemplate が戻り値の HTML を二段目テンプレに展開する。
            $inject->add('admin-main', static function (): string {
                return Twig::renderTemplate('@sample/admin/main.twig');
            });
            $inject->add('admin-topicpath', PLUGIN_DIR . 'SamplePlugin/template/admin/topicpath.html');
        }
    }

    /**
     * インストールする前の環境チェック処理
     *
     * @return bool
     */
    public function checkRequirements()
    {
        return true;
    }

    /**
     * インストールするときの処理
     * データベーステーブルの初期化など
     *
     * @return void
     */
    public function install()
    {
    }

    /**
     * アンインストールするときの処理
     * データベーステーブルの始末など
     *
     * @return void
     */
    public function uninstall()
    {
    }

    /**
     * アップデートするときの処理
     *
     * @return bool
     */
    public function update()
    {
        return true;
    }

    /**
     * 有効化するときの処理
     *
     * @return bool
     */
    public function activate()
    {
        return true;
    }

    /**
     * 無効化するときの処理
     *
     * @return bool
     */
    public function deactivate()
    {
        return true;
    }
}
