<?php
/**
 * Plugin Name: Maple Local Fonts
 * Plugin URI: https://mapleopentech.org/plugins/maple-local-fonts
 * Description: Import Google Fonts to local storage and register them with WordPress Font Library for GDPR-compliant, privacy-friendly typography.
 * Version: 1.0.0
 * Requires at least: 6.5
 * Requires PHP: 7.4
 * Author: Maple Open Technologies
 * Author URI: https://mapleopentech.org
 * License: GPL-2.0-or-later
 * License URI: https://www.gnu.org/licenses/gpl-2.0.html
 * Text Domain: maple-local-fonts
 * Domain Path: /languages
 */

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

// Plugin constants
define('MLF_VERSION', '1.0.0');
define('MLF_PLUGIN_DIR', plugin_dir_path(__FILE__));
define('MLF_PLUGIN_URL', plugin_dir_url(__FILE__));
define('MLF_PLUGIN_BASENAME', plugin_basename(__FILE__));

// Limits
define('MLF_MAX_FONTS_PER_REQUEST', 10);
define('MLF_MAX_WEIGHTS_PER_FONT', 9);
define('MLF_REQUEST_TIMEOUT', 30);
define('MLF_MAX_CSS_SIZE', 512 * 1024);      // 512KB max CSS response
define('MLF_MAX_FONT_FILE_SIZE', 5 * 1024 * 1024); // 5MB max font file
define('MLF_MAX_FONT_FACES', 20);            // Max font faces per import (9 weights × 2 styles + buffer)

/**
 * Check WordPress version on activation.
 */
function mlf_activate() {
    if (version_compare(get_bloginfo('version'), '6.5', '<')) {
        deactivate_plugins(plugin_basename(__FILE__));
        wp_die(
            esc_html__('Maple Local Fonts requires WordPress 6.5 or higher for Font Library support.', 'maple-local-fonts'),
            esc_html__('Plugin Activation Error', 'maple-local-fonts'),
            ['back_link' => true]
        );
    }

    // Ensure fonts directory exists
    $font_dir = wp_get_font_dir();
    if (!file_exists($font_dir['path'])) {
        wp_mkdir_p($font_dir['path']);
    }
}
register_activation_hook(__FILE__, 'mlf_activate');

/**
 * Check WordPress version on admin init (in case WP was downgraded).
 */
function mlf_check_version() {
    if (version_compare(get_bloginfo('version'), '6.5', '<')) {
        deactivate_plugins(plugin_basename(__FILE__));
        add_action('admin_notices', 'mlf_version_notice');
    }
}
add_action('admin_init', 'mlf_check_version');

/**
 * Display version notice.
 */
function mlf_version_notice() {
    echo '<div class="error"><p>';
    esc_html_e('Maple Local Fonts has been deactivated. It requires WordPress 6.5 or higher.', 'maple-local-fonts');
    echo '</p></div>';
}

/**
 * Declare WooCommerce HPOS compatibility.
 */
function mlf_declare_hpos_compatibility() {
    if (class_exists(\Automattic\WooCommerce\Utilities\FeaturesUtil::class)) {
        \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility(
            'custom_order_tables',
            __FILE__,
            true
        );
    }
}
add_action('before_woocommerce_init', 'mlf_declare_hpos_compatibility');

/**
 * Load plugin text domain.
 */
function mlf_load_textdomain() {
    load_plugin_textdomain('maple-local-fonts', false, dirname(MLF_PLUGIN_BASENAME) . '/languages');
}
add_action('plugins_loaded', 'mlf_load_textdomain');

/**
 * Autoload plugin classes.
 */
function mlf_autoload($class) {
    $prefix = 'MLF_';
    if (strpos($class, $prefix) !== 0) {
        return;
    }

    $class_name = str_replace($prefix, '', $class);
    $class_name = str_replace('_', '-', strtolower($class_name));
    $file = MLF_PLUGIN_DIR . 'includes/class-mlf-' . $class_name . '.php';

    if (file_exists($file)) {
        require_once $file;
    }
}
spl_autoload_register('mlf_autoload');

/**
 * Initialize the plugin.
 */
function mlf_init() {
    // Only load admin functionality
    if (is_admin()) {
        new MLF_Admin_Page();
        new MLF_Ajax_Handler();
    }
}
add_action('plugins_loaded', 'mlf_init', 20);

/**
 * Register REST API routes.
 */
function mlf_register_rest_routes() {
    $controller = new MLF_Rest_Controller();
    $controller->register_routes();
}
add_action('rest_api_init', 'mlf_register_rest_routes');

/**
 * Get the required capability for managing fonts.
 *
 * @return string The capability required to manage fonts.
 */
function mlf_get_capability() {
    /**
     * Filter the capability required to manage local fonts.
     *
     * @since 1.0.0
     * @param string $capability Default capability is 'edit_theme_options'.
     */
    return apply_filters('mlf_manage_fonts_capability', 'edit_theme_options');
}

/**
 * Register admin menu.
 */
function mlf_register_menu() {
    add_submenu_page(
        'themes.php',
        __('Maple Local Fonts', 'maple-local-fonts'),
        __('Local Fonts', 'maple-local-fonts'),
        mlf_get_capability(),
        'maple-local-fonts',
        'mlf_render_admin_page'
    );
}
add_action('admin_menu', 'mlf_register_menu');

/**
 * Render admin page (delegates to MLF_Admin_Page).
 */
function mlf_render_admin_page() {
    $admin_page = new MLF_Admin_Page();
    $admin_page->render();
}

/**
 * Enqueue admin assets.
 *
 * @param string $hook The current admin page hook.
 */
function mlf_enqueue_admin_assets($hook) {
    if ($hook !== 'appearance_page_maple-local-fonts') {
        return;
    }

    wp_enqueue_style(
        'mlf-admin',
        MLF_PLUGIN_URL . 'assets/admin.css',
        [],
        MLF_VERSION
    );

    wp_enqueue_script(
        'mlf-admin',
        MLF_PLUGIN_URL . 'assets/admin.js',
        ['jquery'],
        MLF_VERSION,
        true
    );

    wp_localize_script('mlf-admin', 'mapleLocalFontsData', [
        'ajaxUrl'       => admin_url('admin-ajax.php'),
        'downloadNonce' => wp_create_nonce('mlf_download_font'),
        'deleteNonce'   => wp_create_nonce('mlf_delete_font'),
        'strings'       => [
            'downloading'    => __('Downloading...', 'maple-local-fonts'),
            'deleting'       => __('Deleting...', 'maple-local-fonts'),
            'confirmDelete'  => __('Are you sure you want to delete this font?', 'maple-local-fonts'),
            'error'          => __('An error occurred. Please try again.', 'maple-local-fonts'),
            'selectWeight'   => __('Please select at least one weight.', 'maple-local-fonts'),
            'selectStyle'    => __('Please select at least one style.', 'maple-local-fonts'),
            'enterFontName'  => __('Please enter a font name.', 'maple-local-fonts'),
        ],
    ]);
}
add_action('admin_enqueue_scripts', 'mlf_enqueue_admin_assets');
