<?php
/**
 * Bootstrap plugin.
 *
 * @package DatvetaucaotocBooking
 */

declare(strict_types=1);

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

require_once DATVETAU_BOOKING_DIR . 'includes/class-database.php';
require_once DATVETAU_BOOKING_DIR . 'includes/class-settings.php';
require_once DATVETAU_BOOKING_DIR . 'includes/class-route-repository.php';
require_once DATVETAU_BOOKING_DIR . 'includes/class-trip-repository.php';
require_once DATVETAU_BOOKING_DIR . 'includes/class-booking-repository.php';
require_once DATVETAU_BOOKING_DIR . 'includes/class-pricing.php';
require_once DATVETAU_BOOKING_DIR . 'includes/class-validator.php';
require_once DATVETAU_BOOKING_DIR . 'includes/class-booking-service.php';
require_once DATVETAU_BOOKING_DIR . 'includes/class-booking-notifier.php';
require_once DATVETAU_BOOKING_DIR . 'includes/class-rest-api.php';
require_once DATVETAU_BOOKING_DIR . 'includes/class-shortcode.php';
require_once DATVETAU_BOOKING_DIR . 'includes/class-assets.php';
require_once DATVETAU_BOOKING_DIR . 'includes/class-route-seeder.php';
require_once DATVETAU_BOOKING_DIR . 'includes/class-block.php';

final class Datvetau_Booking_Plugin {

	private static bool $admin_loaded = false;

	public static function load_admin(): void {
		if ( self::$admin_loaded ) {
			return;
		}
		require_once DATVETAU_BOOKING_DIR . 'includes/class-trip-importer.php';
		require_once DATVETAU_BOOKING_DIR . 'includes/admin/class-admin-format.php';
		require_once DATVETAU_BOOKING_DIR . 'includes/admin/class-admin-ui.php';
		require_once DATVETAU_BOOKING_DIR . 'includes/admin/class-admin.php';
		self::$admin_loaded = true;
	}

	/** Đang xử lý link Activate trên plugins.php — chỉ chạy hook activate, không load admin nặng. */
	public static function register_admin(): void {
		if ( ! is_admin() ) {
			return;
		}
		try {
			self::load_admin();
			Datvetau_Booking_Admin::register();
		} catch ( Throwable $e ) {
			add_action(
				'admin_notices',
				static function () use ( $e ): void {
					printf(
						'<div class="notice notice-error"><p><strong>%s</strong><br /><code>%s</code></p></div>',
						esc_html__( 'Đặt vé tàu: không tải được phần quản trị.', 'datvetaucaotoc-booking' ),
						esc_html( $e->getMessage() )
					);
				}
			);
		}
	}

	private static ?Datvetau_Booking_Plugin $instance = null;

	public static function instance(): Datvetau_Booking_Plugin {
		if ( null === self::$instance ) {
			self::$instance = new self();
		}
		return self::$instance;
	}

	public function init(): void {
		add_action( 'plugins_loaded', array( $this, 'maybe_upgrade_db' ), 1 );
		add_action( 'init', array( $this, 'load_textdomain' ) );
		Datvetau_Booking_REST_API::register();
		Datvetau_Booking_Shortcode::register();
		Datvetau_Booking_Block::register();
		Datvetau_Booking_Assets::register();

		add_action( 'plugins_loaded', array( self::class, 'register_admin' ), 5 );
	}

	public function maybe_upgrade_db(): void {
		$installed = (string) get_option( 'datvetau_booking_db_version', '' );
		if ( $installed === DATVETAU_BOOKING_VERSION ) {
			return;
		}
		if ( $installed && version_compare( $installed, '0.1.15', '<' ) ) {
			Datvetau_Booking_Settings::migrate_payment_copy_0_1_15();
		}
		Datvetau_Booking_Database::install();
	}

	public function load_textdomain(): void {
		load_plugin_textdomain(
			'datvetaucaotoc-booking',
			false,
			dirname( plugin_basename( DATVETAU_BOOKING_FILE ) ) . '/languages'
		);
	}

}
