<?php
/**
 * Plugin Name:       Solomon Schema
 * Plugin URI:        https://plugins.bowden.works/bw-schema/
 * Description:       Schema Markup Made Simple — Unified structured data for AI systems and search engines.
 * Version:           3.6.0
 * Requires at least: 6.0
 * Requires PHP:      7.4
 * Author:            Bowden Works
 * Author URI:        https://bowden.works
 * License:           GPL-2.0-or-later
 * License URI:       https://www.gnu.org/licenses/gpl-2.0.html
 * Text Domain:       bw-schema
 * Domain Path:       /languages
 * Update URI:        https://plugins.bowden.works/bw-schema/
 */

// Exit if accessed directly
if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

// ====== PLUGIN CONSTANTS ======

define( 'BW_SCHEMA_VERSION', '3.6.0' );
define( 'BW_SCHEMA_PLUGIN_DIR', plugin_dir_path( __FILE__ ) );
define( 'BW_SCHEMA_PLUGIN_URL', plugin_dir_url( __FILE__ ) );
define( 'BW_SCHEMA_PLUGIN_FILE', __FILE__ );
define( 'BW_SCHEMA_PREFIX', 'bw_schema_' );

// ====== AUTOLOADER ======

/**
 * Autoloader for Solomon Schema classes
 *
 * Loads classes from includes/, admin/services/, and admin/pages/ directories.
 * Class naming:
 *   BW_Schema_* → includes/class-*.php
 *   BW_Schema_Service_* → admin/services/class-service-*.php
 *   BW_Schema_Page_* → admin/pages/class-page-*.php
 */
spl_autoload_register( function ( $class ) {
	$prefix = 'BW_Schema_';
	$len    = strlen( $prefix );

	// Check if class starts with our prefix
	if ( strncmp( $prefix, $class, $len ) !== 0 ) {
		return;
	}

	// Extract class name without prefix
	$relative_class = substr( $class, $len );

	// Convert class name to file path format
	$file_name = 'class-' . strtolower( str_replace( '_', '-', $relative_class ) ) . '.php';

	// Check for services (admin/services/)
	if ( strpos( $relative_class, 'Service_' ) === 0 ) {
		$file = BW_SCHEMA_PLUGIN_DIR . 'admin/services/' . $file_name;
		if ( file_exists( $file ) ) {
			require $file;
			return;
		}
	}

	// Check for pages (admin/pages/)
	if ( strpos( $relative_class, 'Page_' ) === 0 || $relative_class === 'Page' ) {
		$file = BW_SCHEMA_PLUGIN_DIR . 'admin/pages/' . $file_name;
		if ( file_exists( $file ) ) {
			require $file;
			return;
		}
	}

	// Check main includes directory
	$file = BW_SCHEMA_PLUGIN_DIR . 'includes/' . $file_name;
	if ( file_exists( $file ) ) {
		require $file;
		return;
	}
});

// ====== PLUGIN BOOTSTRAP ======

/**
 * Initialize the plugin
 *
 * Hook into WordPress to load dependencies and register hooks.
 */
function bw_schema_init() {
	// Load text domain for translations
	load_plugin_textdomain( 'bw-schema', false, dirname( plugin_basename( __FILE__ ) ) . '/languages' );

	// Load core classes
	require_once BW_SCHEMA_PLUGIN_DIR . 'includes/class-core.php';

	// Initialize the plugin
	if ( class_exists( 'BW_Schema_Core' ) ) {
		BW_Schema_Core::get_instance();
	}

	// Initialize frontend schema renderer (page-level schemas: Article, Breadcrumb…)
	// Organization schema is output separately by BW_Schema_Core via BW_Schema_Generator.
	if ( ! is_admin() && ! is_feed() ) {
		if ( class_exists( 'BW_Schema_Schema_Renderer' ) ) {
			BW_Schema_Schema_Renderer::init();
		}
	}
}
add_action( 'plugins_loaded', 'bw_schema_init' );

// ====== PLUGIN HOOKS ======

/**
 * Activation hook
 */
register_activation_hook( __FILE__, function() {
	// Load migration class
	require_once BW_SCHEMA_PLUGIN_DIR . 'includes/class-migration.php';

	// Run activation
	BW_Schema_Migration::activate();
});

/**
 * Deactivation hook
 */
register_deactivation_hook( __FILE__, function() {
	// Load migration class
	require_once BW_SCHEMA_PLUGIN_DIR . 'includes/class-migration.php';

	// Run deactivation
	BW_Schema_Migration::deactivate();
});

/**
 * Uninstall hook
 *
 * Note: register_uninstall_hook() cannot use closures (PHP serialization issue).
 * Instead, WordPress will look for an uninstall.php file in the plugin directory.
 */
if ( file_exists( BW_SCHEMA_PLUGIN_DIR . 'uninstall.php' ) ) {
	// WordPress will automatically call uninstall.php when plugin is deleted
}
