<?php
declare(strict_types=1);
namespace ConfManager;

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}


use ConfManager\Traits\Singleton;
use ConfManager\Traits\HasHooks;

/**
 * プラグインのメインクラス
 *
 * 全モジュールの初期化と共通フックの登録を行う。
 *
 * @since 1.0.0
 */
class ConfManager {

	use Singleton;
	use HasHooks;

	/**
	 * 初期化
	 */
	protected function init(): void {
		$this->register_hooks();
		$this->init_modules();
	}

	/**
	 * フック登録
	 */
	protected function register_hooks(): void {
		$this->add_action( 'init', [ $this, 'on_init' ] );
		$this->add_action( 'admin_init', [ $this, 'maybe_upgrade_db' ] );
	}

	/**
	 * WordPress init フック
	 */
	public function on_init(): void {
		/**
		 * プラグイン初期化完了時に発火
		 *
		 * @since 1.0.0
		 */
		do_action( 'conf_manager_init' );
	}

	/**
	 * DBバージョンチェックとアップグレード
	 */
	public function maybe_upgrade_db(): void {
		Activator::maybe_upgrade();
	}

	/**
	 * 各モジュールを初期化する
	 */
	private function init_modules(): void {
		// 管理画面
		if ( is_admin() ) {
			\ConfManager\Admin\AdminMenu::instance();
		}

		// フロント画面
		\ConfManager\Frontend\PublicController::instance();

		// Fonts
		Fonts\FontManager::instance();

		// API
		Api\AdminApi::instance();
		Api\PublicApi::instance();

		// Security Module
		Security\Encryption::instance();
		Security\AuditLog::instance();
		Security\PasskeyAuth::instance();
		Security\RateLimiter::instance();

		// Member Module
		Members\MemberManager::instance();
		Members\MemberApi::instance();
		Members\SelfRegistration::instance();

		// Event Module
		Events\EventManager::instance();
		Events\SessionManager::instance();
		Events\EventApi::instance();

		// Registration Module
		Registration\RegistrationManager::instance();
		Registration\GroupRegistration::instance();
		Registration\RegistrationApi::instance();

		// Payment Module
		Payment\PaymentManager::instance();
		Payment\BankTransfer::instance();
		Payment\StripePayment::instance();
		Payment\InvoiceGenerator::instance();
		Payment\ReceiptGenerator::instance();
		Payment\PaymentApi::instance();

		// Notification Module (transactional only — bulk/scheduled is a paid add-on)
		Notification\MailHeaders::instance();
		Notification\TransactionalMailer::instance();
	}
}
