<?php

namespace WooNooW\Frontend;

/**
 * Frontend Assets Manager
 * Handles loading of customer-spa assets
 */
class Assets
{

    /**
     * Initialize
     */
    public static function init()
    {
        add_action('wp_enqueue_scripts', [self::class, 'enqueue_assets'], 20);
        add_action('wp_head', [self::class, 'add_inline_config'], 5);
        add_action('wp_enqueue_scripts', [self::class, 'dequeue_conflicting_scripts'], 100);
        add_filter('script_loader_tag', [self::class, 'add_module_type'], 10, 3);
        add_action('woocommerce_before_main_content', [self::class, 'inject_spa_mount_point'], 5);

        // Hide admin bar if configured
        $settings = get_option('woonoow_appearance_settings', []);
        if (!empty($settings['general']['hide_admin_bar'])) {
            add_filter('show_admin_bar', '__return_false');
        }
    }

    /**
     * Add type="module" to customer-spa scripts
     */
    public static function add_module_type($tag, $handle, $src)
    {
        // Add type="module" to our Vite scripts
        if (strpos($handle, 'woonoow-customer') !== false) {
            $tag = str_replace('<script ', '<script type="module" ', $tag);
        }
        return $tag;
    }

    /**
     * Enqueue customer-spa assets
     */
    public static function enqueue_assets()
    {
        // Only load on pages with WooNooW shortcodes or in full SPA mode
        if (!self::should_load_assets()) {
            return;
        }

        // Check if dev mode is enabled
        $is_dev = defined('WOONOOW_CUSTOMER_DEV') && WOONOOW_CUSTOMER_DEV;

        if ($is_dev) {
            // Dev mode: Load from Vite dev server
            $dev_server = 'https://woonoow.local:5174';

            // Vite client for HMR
            wp_enqueue_script(
                'woonoow-customer-vite',
                $dev_server . '/@vite/client',
                [],
                null,
                false // Load in header
            );

            // Main entry point
            wp_enqueue_script(
                'woonoow-customer-spa',
                $dev_server . '/src/main.tsx',
                ['woonoow-customer-vite'],
                null,
                false // Load in header
            );
        } else {
            // Production mode: Load from build
            $plugin_url = plugin_dir_url(dirname(dirname(__FILE__)));
            $dist_path  = plugin_dir_path(dirname(dirname(__FILE__))) . 'customer-spa/dist/';

            // Check if build exists
            if (!file_exists($dist_path)) {
                return;
            }

            // Production build - load app.js and app.css directly
            $js_url = $plugin_url . 'customer-spa/dist/app.js';
            $css_url = $plugin_url . 'customer-spa/dist/app.css';

            wp_enqueue_script(
                'woonoow-customer-spa',
                $js_url,
                [],
                null,
                true
            );

            // Add type="module" for Vite build
            add_filter('script_loader_tag', function ($tag, $handle, $src) {
                if ($handle === 'woonoow-customer-spa') {
                    $tag = str_replace('<script ', '<script type="module" ', $tag);
                }
                return $tag;
            }, 10, 3);

            wp_enqueue_style(
                'woonoow-customer-spa',
                $css_url,
                [],
                null
            );
        }
    }

    /**
     * Inject SPA mounting point for full mode
     */
    public static function inject_spa_mount_point()
    {
        if (!self::should_load_assets()) {
            return;
        }

        // Get appearance settings for unified spa_mode check
        $appearance_settings = get_option('woonoow_appearance_settings', []);
        $spa_mode = $appearance_settings['general']['spa_mode'] ?? 'full';

        if ($spa_mode === 'full') {
            // Only inject if the mount point doesn't already exist (from shortcode)
            $request_uri = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : '/';
            $current_path = parse_url($request_uri, PHP_URL_PATH);
            echo '<div id="woonoow-customer-app" data-page="shop" data-initial-route="' . esc_attr($current_path) . '"><div class="woonoow-loading"><p>Loading...</p></div></div>';
        }
    }

    /**
     * Add inline config and scripts to page head
     */
    public static function add_inline_config()
    {
        if (!self::should_load_assets()) {
            return;
        }

        // Get Customer SPA settings
        $spa_settings = get_option('woonoow_customer_spa_settings', []);
        $default_settings = [
            'mode' => 'disabled',
            'layout' => 'modern',
            'colors' => [
                'primary' => get_option('woonoow_primary_color', '#111827'), // Gray-900 from Store Details
                'secondary' => '#6B7280', // Gray-500
                'accent' => '#10B981',
            ],
            'typography' => [
                'preset' => 'professional',
            ],
        ];
        $theme_settings = array_replace_recursive($default_settings, $spa_settings);

        // Get appearance settings and preload them
        $stored_settings = get_option('woonoow_appearance_settings', []);
        $default_appearance = \WooNooW\Admin\AppearanceController::get_default_settings();

        // Merge stored settings with defaults to ensure new fields (like gradient colors) exist
        $appearance_settings = array_replace_recursive($default_appearance, $stored_settings);

        // Get WooCommerce currency settings
        $currency_settings = [
            'code' => get_woocommerce_currency(),
            'symbol' => get_woocommerce_currency_symbol(),
            'position' => get_option('woocommerce_currency_pos', 'left'),
            'thousandSeparator' => wc_get_price_thousand_separator(),
            'decimalSeparator' => wc_get_price_decimal_separator(),
            'decimals' => wc_get_price_decimals(),
        ];

        // Get store logo from WooNooW Store Details (Settings > Store Details)
        $logo_url = get_option('woonoow_store_logo', '');

        // Get user billing/shipping data if logged in
        $user_data = [
            'isLoggedIn' => is_user_logged_in(),
            'id'         => get_current_user_id(),
        ];

        if (is_user_logged_in()) {
            $customer = new \WC_Customer(get_current_user_id());
            $user_data['email'] = $customer->get_email();
            $user_data['billing'] = [
                'first_name' => $customer->get_billing_first_name(),
                'last_name'  => $customer->get_billing_last_name(),
                'email'      => $customer->get_billing_email(),
                'phone'      => $customer->get_billing_phone(),
                'address_1'  => $customer->get_billing_address_1(),
                'city'       => $customer->get_billing_city(),
                'state'      => $customer->get_billing_state(),
                'postcode'   => $customer->get_billing_postcode(),
                'country'    => $customer->get_billing_country(),
            ];
            $user_data['shipping'] = [
                'first_name' => $customer->get_shipping_first_name(),
                'last_name'  => $customer->get_shipping_last_name(),
                'address_1'  => $customer->get_shipping_address_1(),
                'city'       => $customer->get_shipping_city(),
                'state'      => $customer->get_shipping_state(),
                'postcode'   => $customer->get_shipping_postcode(),
                'country'    => $customer->get_shipping_country(),
            ];
        }

        // Determine SPA base path for BrowserRouter
        $spa_page_id = $appearance_settings['general']['spa_page'] ?? 0;
        $spa_page = $spa_page_id ? get_post($spa_page_id) : null;

        // Check if SPA Entry Page is set as WordPress frontpage
        $frontpage_id = (int) get_option('page_on_front');
        $is_spa_wp_frontpage = $frontpage_id && $spa_page_id && $frontpage_id === (int) $spa_page_id;

        // Get SPA Landing page (explicit setting, separate from Entry Page)
        // This determines what content to show at the SPA root route "/"
        $spa_frontpage_id = $appearance_settings['general']['spa_frontpage'] ?? 0;
        $front_page_slug = '';
        if ($spa_frontpage_id) {
            $spa_frontpage = get_post($spa_frontpage_id);
            if ($spa_frontpage) {
                $front_page_slug = $spa_frontpage->post_name;
            }
        } elseif ($is_spa_wp_frontpage && $spa_page) {
            // If the SPA Entry Page itself is set as the WP Frontpage, 
            // use its content as the SPA Frontpage content.
            $front_page_slug = $spa_page->post_name;
        }

        // If SPA Entry Page is WP frontpage, base path is /, otherwise use Entry Page slug
        $base_path = $is_spa_wp_frontpage ? '' : ($spa_page ? '/' . $spa_page->post_name : '/store');

        // When injecting into a CPT or structural page, the URL does not start with the SPA base path.
        // E.g., /desain-mockup... instead of /store/desain-mockup...
        // For these pages, we must force the base path to empty so BrowserRouter starts from the root.
        if (is_singular() && (!isset($spa_page) || get_queried_object_id() !== $spa_page->ID)) {
            // If we're on a singular page that isn't the SPA Entry Page, it's a structural page or CPT
            $base_path = '';
        }

        // Check if BrowserRouter is enabled (default: true for SEO)
        $use_browser_router = $appearance_settings['general']['use_browser_router'] ?? true;

        $config = [
            'apiUrl' => rest_url('woonoow/v1'),
            'apiRoot' => rest_url('woonoow/v1'),
            'nonce'  => wp_create_nonce('wp_rest'),
            'siteUrl' => get_site_url(),
            'siteTitle' => get_bloginfo('name'),
            'siteName' => get_bloginfo('name'),
            'storeName' => get_bloginfo('name'),
            'storeLogo' => $logo_url,
            'user'   => $user_data,
            'theme' => $theme_settings,
            'currency' => $currency_settings,
            'appearanceSettings' => $appearance_settings,
            'basePath' => $base_path,
            'useBrowserRouter' => $use_browser_router,
            'frontPageSlug' => $front_page_slug,
            'spaMode' => $appearance_settings['general']['spa_mode'] ?? 'full',
            'security' => \WooNooW\Compat\SecuritySettingsProvider::get_public_settings(),
        ];

?>
        <script type="text/javascript">
            window.woonoowCustomer = <?php echo wp_json_encode($config); ?>;
        </script>
        <?php

        // If dev mode, output scripts directly
        $is_dev = defined('WOONOOW_CUSTOMER_DEV') && WOONOOW_CUSTOMER_DEV;
        if ($is_dev) {
            $dev_server = 'https://woonoow.local:5174';
        ?>
            <script type="module">
                import RefreshRuntime from '<?php echo $dev_server; ?>/@react-refresh'
                RefreshRuntime.injectIntoGlobalHook(window)
                window.$RefreshReg$ = () => {}
                window.$RefreshSig$ = () => (type) => type
                window.__vite_plugin_react_preamble_installed__ = true
            </script>
            <script type="module" crossorigin src="<?php echo $dev_server; ?>/@vite/client"></script>
            <script type="module" crossorigin src="<?php echo $dev_server; ?>/src/main.tsx"></script>
<?php
        }
    }

    /**
     * Check if we should load assets on this page
     */
    public static function should_load_assets()
    {
        // Don't load on admin pages
        if (is_admin()) {
            return false;
        }

        // Force load if constant is defined (e.g. for preview)
        if (defined('WOONOOW_SERVE_SPA') && WOONOOW_SERVE_SPA) {
            return true;
        }

        // Get SPA mode from appearance settings
        $appearance_settings = get_option('woonoow_appearance_settings', []);
        $mode = $appearance_settings['general']['spa_mode'] ?? 'full';

        // Check if SPA is completely disabled
        if ($mode === 'disabled') {
            return false;
        }

        // First check: Is this a designated SPA page?
        if (self::is_spa_page()) {
            return true;
        }

        // Check if we're on a frontpage SPA route
        if (self::is_frontpage_spa_route()) {
            return true;
        }

        // For structural pages (is_singular('page'))
        if (is_singular('page')) {
            $page_id = get_queried_object_id();
            $structure = get_post_meta($page_id, '_wn_page_structure', true);
            if (!empty($structure) && !empty($structure['sections'])) {
                return true;
            }
        }

        // For CPTs with WooNooW templates
        if (is_singular() && !is_singular('page')) {
            $post_type = get_post_type();
            if (!in_array($post_type, ['product', 'shop_order', 'shop_coupon'])) {
                $wn_template = get_option("wn_template_{$post_type}", null);
                if (!empty($wn_template) && !empty($wn_template['sections'])) {
                    return true;
                }
            }
        }

        // Full SPA mode - load on all WooCommerce pages
        if ($mode === 'full') {
            if (function_exists('is_shop') && is_shop()) {
                return true;
            }
            if (function_exists('is_product') && is_product()) {
                return true;
            }
            if (function_exists('is_cart') && is_cart()) {
                return true;
            }
            if (function_exists('is_checkout') && is_checkout()) {
                return true;
            }
            if (function_exists('is_account_page') && is_account_page()) {
                return true;
            }
            return false;
        }

        // Checkout-Only mode - load only on specific pages
        if ($mode === 'checkout_only') {
            $spa_settings = get_option('woonoow_customer_spa_settings', []);
            $checkout_pages = isset($spa_settings['checkoutPages']) ? $spa_settings['checkoutPages'] : [];

            if (!empty($checkout_pages['checkout']) && function_exists('is_checkout') && is_checkout() && !is_order_received_page()) {
                return true;
            }
            if (!empty($checkout_pages['thankyou']) && function_exists('is_order_received_page') && is_order_received_page()) {
                return true;
            }
            if (!empty($checkout_pages['account']) && function_exists('is_account_page') && is_account_page()) {
                return true;
            }
            if (!empty($checkout_pages['cart']) && function_exists('is_cart') && is_cart()) {
                return true;
            }
            return false;
        }

        global $post;
        // Check if current page has WooNooW shortcodes
        if ($post && has_shortcode($post->post_content, 'woonoow_shop')) {
            return true;
        }
        if ($post && has_shortcode($post->post_content, 'woonoow_cart')) {
            return true;
        }
        if ($post && has_shortcode($post->post_content, 'woonoow_checkout')) {
            return true;
        }
        if ($post && has_shortcode($post->post_content, 'woonoow_account')) {
            return true;
        }

        return false;
    }

    /**
     * Check if current page is the designated SPA page
     */
    private static function is_spa_page()
    {
        global $post;
        if (!$post) {
            return false;
        }

        // Get SPA page ID from appearance settings
        $appearance_settings = get_option('woonoow_appearance_settings', []);
        $spa_page_id = isset($appearance_settings['general']['spa_page']) ? $appearance_settings['general']['spa_page'] : 0;

        // Check if current page matches the SPA page
        if ($spa_page_id && $post->ID == $spa_page_id) {
            return true;
        }

        return false;
    }

    /**
     * Check if current request is a frontpage SPA route
     * Used to detect SPA routes by URL when SPA page is set as frontpage
     */
    private static function is_frontpage_spa_route()
    {
        // Get SPA settings
        $appearance_settings = get_option('woonoow_appearance_settings', []);
        $spa_page_id = $appearance_settings['general']['spa_page'] ?? 0;
        $spa_mode = $appearance_settings['general']['spa_mode'] ?? 'full';

        // Only run in full SPA mode
        if ($spa_mode !== 'full' || !$spa_page_id) {
            return false;
        }

        // Check if SPA page is set as WordPress frontpage
        $frontpage_id = (int) get_option('page_on_front');
        if (!$frontpage_id || $frontpage_id !== (int) $spa_page_id) {
            return false;
        }

        // Get the current request path
        $request_uri = $_SERVER['REQUEST_URI'] ?? '/';
        $path = parse_url($request_uri, PHP_URL_PATH);
        $path = '/' . trim($path, '/');

        // Define SPA routes
        $spa_routes = ['/', '/shop', '/cart', '/checkout', '/my-account', '/login', '/register', '/reset-password'];

        // Check exact matches
        if (in_array($path, $spa_routes)) {
            return true;
        }

        // Check path prefixes
        $prefix_routes = ['/shop/', '/my-account/', '/product/'];
        foreach ($prefix_routes as $prefix) {
            if (strpos($path, $prefix) === 0) {
                return true;
            }
        }

        return false;
    }

    /**
     * Dequeue conflicting scripts when SPA is active
     */
    public static function dequeue_conflicting_scripts()
    {
        if (!self::should_load_assets()) {
            return;
        }

        // Dequeue WooCommerce scripts that conflict with SPA
        wp_dequeue_script('wc-cart-fragments');
        wp_dequeue_script('woocommerce');
        wp_dequeue_script('wc-add-to-cart');
        wp_dequeue_script('wc-add-to-cart-variation');

        // Dequeue WordPress block scripts that cause errors in SPA
        wp_dequeue_script('wp-block-library');
        wp_dequeue_script('wp-block-navigation');
        wp_dequeue_script('wp-interactivity');
        wp_dequeue_script('wp-interactivity-router');

        // Keep only essential WooCommerce styles, dequeue others if needed
        // wp_dequeue_style('woocommerce-general');
        // wp_dequeue_style('woocommerce-layout');
        // wp_dequeue_style('woocommerce-smallscreen');
    }
}
