<?php
use WprAddons\Plugin;

// Register Post Type
function register_mega_menu_cpt() {
    $args = array(
        'label'				  => esc_html__( 'Royal Mega Menu', 'wpr-addons' ),
        'public'              => true,
        'publicly_queryable'  => true,
        'rewrite'             => false,
        'show_ui'             => true,
        'show_in_menu'        => false,
        'show_in_nav_menus'   => false,
        'exclude_from_search' => true,
        'capability_type'     => 'post',
        'supports'            => array( 'title', 'editor', 'elementor' ),
        'hierarchical'        => false,
    );

    register_post_type( 'wpr_mega_menu', $args );
}

// Convert to Canvas Template
function convert_to_canvas_template( $template ) {
    if ( is_singular('wpr_mega_menu') ) {
        $template = WPR_ADDONS_PATH . 'admin/templates/wpr-canvas.php';
    }

    return $template;
}

// Init Mega Menu
function init_mega_menu() {
    register_mega_menu_cpt();
    add_action( 'template_include', 'convert_to_canvas_template', 9999 );
}

add_action('init', 'init_mega_menu', 999);


// Confinue only for Dashboard Screen
if ( !is_admin() ) return;

// Init Actions
add_filter( 'option_elementor_cpt_support', 'add_mega_menu_cpt_support' );
add_filter( 'default_option_elementor_cpt_support', 'add_mega_menu_cpt_support' );
add_action( 'admin_footer', 'render_settings_popup', 10 );
add_action( 'wp_ajax_wpr_create_mega_menu_template', 'wpr_create_mega_menu_template' );
add_action( 'wp_ajax_wpr_save_mega_menu_settings', 'wpr_save_mega_menu_settings' );
add_action( 'admin_enqueue_scripts', 'enqueue_scripts' );

// Add Elementor Editor Support
function add_mega_menu_cpt_support( $value ) {
    if ( empty( $value ) ) {
        $value = [];
    }

    return array_merge( $value, ['wpr_mega_menu'] ); 
}

// Create Menu Template
function wpr_create_mega_menu_template() {

    if ( ! isset( $_POST['nonce'] ) || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['nonce'] ) ), 'wpr-mega-menu-js' ) || ! current_user_can( 'manage_options' ) ) {
        wp_send_json_error( [ 'message' => 'Invalid request.' ] );
        return;
    }

    if ( ! isset( $_POST['item_id'] ) ) {
        wp_send_json_error( [ 'message' => 'Missing item_id.' ] );
        return;
    }

    $menu_item_id = absint( $_POST['item_id'] );
    $menu_item = get_post( $menu_item_id );
    if ( ! $menu_item || $menu_item->post_type !== 'nav_menu_item' ) {
        wp_send_json_error( [ 'message' => 'Invalid menu item.' ] );
        return;
    }

    $mega_menu_id = get_post_meta( $menu_item_id, 'wpr-mega-menu-item', true );

    if ( ! $mega_menu_id ) {

        $mega_menu_id = wp_insert_post( array(
            'post_title'  => 'wpr-mega-menu-item-' . $menu_item_id,
            'post_status' => 'publish',
            'post_type'   => 'wpr_mega_menu',
        ) );

        update_post_meta( $menu_item_id, 'wpr-mega-menu-item', $mega_menu_id );

    }

    $edit_link = add_query_arg(
        array(
            'post' => $mega_menu_id,
            'action' => 'elementor',
        ),
        admin_url( 'post.php' )
    );

    wp_send_json([
        'data' => [
            'edit_link' => $edit_link
        ]
    ]);
}

// Render Settings Popup
function render_settings_popup() {
    $screen = get_current_screen();

    if ( 'nav-menus' !== $screen->base ) {
        return;
    }

    ?>

    <div class="wpr-mm-settings-popup-wrap">
        <div class="wpr-mm-settings-popup">
            <div class="wpr-mm-settings-popup-header">
                <span class="wpr-mm-popup-logo" style="background:url('<?php echo esc_url( WPR_ADDONS_ASSETS_URL . 'img/logo-40x40.png' ); ?>') no-repeat center center / contain;">RE</span>
                <span><?php esc_html_e('Royal Mega Menu', 'wpr-addons'); ?></span>
                <span class="wpr-mm-popup-title"><?php esc_html_e('Menu Item: ', 'wpr-addons'); ?><span></span></span>
                <span class="dashicons dashicons-no-alt wpr-mm-settings-close-popup-btn"></span>
            </div>

            <?php $pro_active = defined('WPR_ADDONS_PRO_VERSION') && wpr_fs()->can_use_premium_code() ? 'data-pro-active="true"' : 'data-pro-active="false"'; ?>
            
            <div class="wpr-mm-settings-wrap" <?php echo $pro_active; ?>>
                <h4><?php esc_html_e('General', 'wpr-addons'); ?></h4>
                <div class="wpr-mm-setting wpr-mm-setting-switcher">
                    <h4><?php esc_html_e('Enable Mega Menu', 'wpr-addons'); ?></h4>
                    <input type="checkbox" id="wpr_mm_enable">
                    <label for="wpr_mm_enable"></label>
                </div>
                <div class="wpr-mm-setting">
                    <h4><?php esc_html_e('Mega Menu Content', 'wpr-addons'); ?></h4>
                    <button class="button button-primary wpr-edit-mega-menu-btn">
                        <i class="eicon-elementor-square" aria-hidden="true"></i>
                        <?php esc_html_e('Edit with Elementor', 'wpr-addons'); ?>
                    </button>
                </div>
                <div class="wpr-mm-setting">
                    <h4><?php esc_html_e('Dropdown Position', 'wpr-addons'); ?></h4>
                    <select id="wpr_mm_position">
                        <option value="default"><?php esc_html_e('Default', 'wpr-addons'); ?></option>
                        <option value="relative"><?php esc_html_e('Relative', 'wpr-addons'); ?></option>
                    </select>
                </div>
                <div class="wpr-mm-setting">
                    <h4><?php esc_html_e('Dropdown Width', 'wpr-addons'); ?></h4>
                    <select id="wpr_mm_width">
                        <option value="default"><?php esc_html_e('Default', 'wpr-addons'); ?></option>
                        <?php if ( !defined('WPR_ADDONS_PRO_VERSION') || !wpr_fs()->can_use_premium_code() ) : ?>
                        <option value="pro-st"><?php esc_html_e('Fit to Section (Pro)', 'wpr-addons'); ?></option>
                        <?php else: ?>
                        <option value="stretch"><?php esc_html_e('Fit to Section', 'wpr-addons'); ?></option>
                        <?php endif; ?>
                        <option value="full"><?php esc_html_e('Full Width', 'wpr-addons'); ?></option>
                        <option value="custom"><?php esc_html_e('Custom', 'wpr-addons'); ?></option>
                    </select>
                </div>
                <div class="wpr-mm-setting">
                    <h4><?php esc_html_e('Custom Width (px)', 'wpr-addons'); ?></h4>
                    <input type="number" id="wpr_mm_custom_width" value="600">
                </div>
                <div class="wpr-mm-setting <?php echo !defined('WPR_ADDONS_PRO_VERSION') || !wpr_fs()->can_use_premium_code() ? 'wpr-mm-pro-setting' : ''; ?>">
                    <h4><?php esc_html_e('Mobile Sub Content', 'wpr-addons'); ?></h4>
                    <div>
                        <select id="wpr_mm_mobile_content">
                            <option value="mega"><?php esc_html_e('Mega Menu', 'wpr-addons'); ?></option>
                            <option value="wp-sub"><?php esc_html_e('WordPress Sub Items', 'wpr-addons'); ?></option>
                        </select>

                        <div class="wpr-mm-pro-radio">
                            <input type="radio" name="mc" checked="checked">
                            <label>Mega Menu</label><br>
                            <input type="radio" name="mc">
                            <label>WordPress Sub Items</label>
                        </div>
                    </div>
                </div>
                <div class="wpr-mm-setting <?php echo !defined('WPR_ADDONS_PRO_VERSION') || !wpr_fs()->can_use_premium_code() ? 'wpr-mm-pro-setting' : ''; ?>">
                    <h4><?php esc_html_e('Mobile Sub Render', 'wpr-addons'); ?></h4>
                    <div>
                        <select id="wpr_mm_render">
                            <option value="default"><?php esc_html_e('Default', 'wpr-addons'); ?></option>
                            <option value="ajax"><?php esc_html_e('Load with AJAX', 'wpr-addons'); ?></option>
                        </select>

                        <div class="wpr-mm-pro-radio">
                            <input type="radio" name="mr" checked="checked">
                            <label>Default</label><br>
                            <input type="radio" name="mr">
                            <label>Load with AJAX</label>
                        </div>
                    </div>
                </div>

                <br>

                <h4 <?php echo !defined('WPR_ADDONS_PRO_VERSION') || !wpr_fs()->can_use_premium_code() ? 'class="wpr-mm-pro-heading"' : ''; ?>>
                    <?php esc_html_e('Icon', 'wpr-addons'); ?>
                </h4>
                <div <?php echo !defined('WPR_ADDONS_PRO_VERSION') || !wpr_fs()->can_use_premium_code() ? 'class="wpr-mm-pro-section"' : ''; ?>>
                    <div class="wpr-mm-setting wpr-mm-setting-icon">
                        <h4><?php esc_html_e('Icon Select', 'wpr-addons'); ?></h4>
                        <div><span class="wpr-mm-active-icon"><i class="fas fa-ban"></i></span><span><i class="fas fa-angle-down"></i></span></div>
                        <input type="text" id="wpr_mm_icon_picker" data-alpha="true" value="">
                    </div>
                    <div class="wpr-mm-setting wpr-mm-setting-color">
                        <h4><?php esc_html_e('Icon Color', 'wpr-addons'); ?></h4>
                        <input type="text" id="wpr_mm_icon_color" data-alpha="true" value="rgba(0,0,0,0.6);">
                    </div>
                    <div class="wpr-mm-setting">
                        <h4><?php esc_html_e('Icon Size (px)', 'wpr-addons'); ?></h4>
                        <input type="number" id="wpr_mm_icon_size" value="14">
                    </div>
                </div>

                <br>

                <h4 <?php echo !defined('WPR_ADDONS_PRO_VERSION') || !wpr_fs()->can_use_premium_code() ? 'class="wpr-mm-pro-heading"' : ''; ?>>
                    <?php esc_html_e('Badge', 'wpr-addons'); ?>
                </h4>
                <div <?php echo !defined('WPR_ADDONS_PRO_VERSION') || !wpr_fs()->can_use_premium_code() ? 'class="wpr-mm-pro-section"' : ''; ?>>
                    <div class="wpr-mm-setting">
                        <h4><?php esc_html_e('Badge Text', 'wpr-addons'); ?></h4>
                        <input type="text" id="wpr_mm_badge_text" value="">
                    </div>
                    <div class="wpr-mm-setting wpr-mm-setting-color">
                        <h4><?php esc_html_e('Badge Text Color', 'wpr-addons'); ?></h4>
                        <input type="text" id="wpr_mm_badge_color" data-alpha="true" value="rgba(0,0,0,0.6);">
                    </div>
                    <div class="wpr-mm-setting wpr-mm-setting-color">
                        <h4><?php esc_html_e('Badge Background Color', 'wpr-addons'); ?></h4>
                        <input type="text" id="wpr_mm_badge_bg_color" data-alpha="true" value="rgba(0,0,0,0.6);">
                    </div>
                    <div class="wpr-mm-setting wpr-mm-setting-switcher">
                        <h4><?php esc_html_e('Enable Animation', 'wpr-addons'); ?></h4>
                        <input type="checkbox" id="wpr_mm_badge_animation">
                        <label for="wpr_mm_badge_animation"></label>
                    </div>
                </div>
            </div>

            <div class="wpr-mm-settings-popup-footer">
                <button class="button wpr-save-mega-menu-btn"><?php esc_html_e('Save', 'wpr-addons'); ?></button>
            </div>
        </div>
    </div>

    <!-- Iframe Popup -->
    <div class="wpr-mm-editor-popup-wrap">
        <div class="wpr-mm-editor-close-popup-btn"><span class="dashicons dashicons-no-alt"></span></div>
        <div class="wpr-mm-editor-popup-iframe"></div>
    </div>
    <?php
}

/**
 * Allowed mega menu setting keys (whitelist for sanitization).
 *
 * @return array
 */
function wpr_mega_menu_allowed_settings_keys() {
    return [
        'wpr_mm_enable',
        'wpr_mm_position',
        'wpr_mm_width',
        'wpr_mm_custom_width',
        'wpr_mm_mobile_content',
        'wpr_mm_render',
        'wpr_mm_icon_picker',
        'wpr_mm_icon_color',
        'wpr_mm_icon_size',
        'wpr_mm_badge_text',
        'wpr_mm_badge_color',
        'wpr_mm_badge_bg_color',
        'wpr_mm_badge_animation',
    ];
}

/**
 * Sanitize a single mega menu setting value.
 *
 * @param mixed $value Raw value.
 * @param string $key Setting key.
 * @return mixed Sanitized value.
 */
function wpr_sanitize_mega_menu_setting( $value, $key ) {
    if ( ! is_scalar( $value ) ) {
        return '';
    }
    $value = (string) $value;
    if ( in_array( $key, [ 'wpr_mm_icon_color', 'wpr_mm_badge_color', 'wpr_mm_badge_bg_color' ], true ) ) {
        return sanitize_text_field( $value );
    }
    if ( $key === 'wpr_mm_icon_size' || $key === 'wpr_mm_custom_width' ) {
        return absint( $value );
    }
    return sanitize_text_field( $value );
}

// Save Mega Menu Settings
function wpr_save_mega_menu_settings() {

    if ( ! isset( $_POST['nonce'] ) || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['nonce'] ) ), 'wpr-mega-menu-js' ) || ! current_user_can( 'manage_options' ) ) {
        wp_send_json_error( [ 'message' => 'Invalid request.' ] );
        return;
    }

    if ( ! isset( $_POST['item_id'] ) || ! isset( $_POST['item_settings'] ) || ! is_array( $_POST['item_settings'] ) ) {
        wp_send_json_error( [ 'message' => 'Missing item_id or item_settings.' ] );
        return;
    }

    $item_id = absint( $_POST['item_id'] );
    $item_post = get_post( $item_id );
    if ( ! $item_post || $item_post->post_type !== 'nav_menu_item' ) {
        wp_send_json_error( [ 'message' => 'Invalid menu item.' ] );
        return;
    }

    $allowed_keys = wpr_mega_menu_allowed_settings_keys();
    $raw         = wp_unslash( $_POST['item_settings'] );
    $sanitized   = [];
    foreach ( $allowed_keys as $key ) {
        if ( array_key_exists( $key, $raw ) ) {
            $sanitized[ $key ] = wpr_sanitize_mega_menu_setting( $raw[ $key ], $key );
        }
    }

    update_post_meta( $item_id, 'wpr-mega-menu-settings', $sanitized );
    wp_send_json_success( $sanitized );
}

// Get Menu Items Data
function get_menu_items_data( $menu_id = false ) {

    if ( ! $menu_id ) {
        return false;
    }

    $menu = wp_get_nav_menu_object( $menu_id );

    $menu_items = wp_get_nav_menu_items( $menu );

    if ( ! $menu_items ) {
        return false;
    }

    return $menu_items;
}

// Get Mega Menu Item Settings
function get_menu_items_settings() {
    $menu_items = get_menu_items_data( get_selected_menu_id() );

    $settings = [];

    if ( ! $menu_items ) {
        return [];
    } else {
        foreach ( $menu_items as $key => $item_object ) {
            $item_id = $item_object->ID;

            $item_meta = get_post_meta( $item_id, 'wpr-mega-menu-settings', true );

            if ( !empty($item_meta) ) {
                $settings[ $item_id ] = $item_meta;
            } else {
                $settings[ $item_id ] = [];
            }
        }
        
        return $settings;
    }
}

/**
* Get the Selected menu ID
* @author Tom Hemsley (https://wordpress.org/plugins/megamenu/)
*/
function get_selected_menu_id() {
    $nav_menus = wp_get_nav_menus( array('orderby' => 'name') );
    $menu_count = count( $nav_menus );
    $nav_menu_selected_id = isset( $_REQUEST['menu'] ) ? (int) $_REQUEST['menu'] : 0;
    $add_new_screen = ( isset( $_GET['menu'] ) && 0 == $_GET['menu'] ) ? true : false;

    $current_menu_id = $nav_menu_selected_id;

    // If we have one theme location, and zero menus, we take them right into editing their first menu
    $page_count = wp_count_posts( 'page' );
    $one_theme_location_no_menus = ( 1 == count( get_registered_nav_menus() ) && ! $add_new_screen && empty( $nav_menus ) && ! empty( $page_count->publish ) ) ? true : false;

    // Get recently edited nav menu
    $recently_edited = absint( get_user_option( 'nav_menu_recently_edited' ) );
    if ( empty( $recently_edited ) && is_nav_menu( $current_menu_id ) ) {
        $recently_edited = $current_menu_id;
    }

    // Use $recently_edited if none are selected
    if ( empty( $current_menu_id ) && ! isset( $_GET['menu'] ) && is_nav_menu( $recently_edited ) ) {
        $current_menu_id = $recently_edited;
    }

    // On deletion of menu, if another menu exists, show it
    if ( ! $add_new_screen && 0 < $menu_count && isset( $_GET['action'] ) && 'delete' == $_GET['action'] ) {
        $current_menu_id = $nav_menus[0]->term_id;
    }

    // Set $current_menu_id to 0 if no menus
    if ( $one_theme_location_no_menus ) {
        $current_menu_id = 0;
    } elseif ( empty( $current_menu_id ) && ! empty( $nav_menus ) && ! $add_new_screen ) {
        // if we have no selection yet, and we have menus, set to the first one in the list
        $current_menu_id = $nav_menus[0]->term_id;
    }

    return $current_menu_id;

}

// Enqueue Scripts and Styles
function enqueue_scripts( $hook ) {

    // Get Plugin Version
    $version = Plugin::instance()->get_version();

    // Deny if NOT a Menu Page
    if ( 'nav-menus.php' == $hook ) {

        // Color Picker
        wp_enqueue_style( 'wp-color-picker' );
        wp_enqueue_script( 'wp-color-picker-alpha', WPR_ADDONS_URL .'assets/js/admin/lib/wp-color-picker-alpha.min.js', ['jquery', 'wp-color-picker'], $version, true );

        // Icon Picker
        wp_enqueue_script( 'wpr-iconpicker-js', WPR_ADDONS_URL .'assets/js/admin/lib/iconpicker/fontawesome-iconpicker.min.js', ['jquery'], $version, true );
        wp_enqueue_style( 'wpr-iconpicker-css', WPR_ADDONS_URL .'assets/js/admin/lib/iconpicker/fontawesome-iconpicker.min.css', $version, true );
        wp_enqueue_style( 'wpr-el-fontawesome-css', ELEMENTOR_URL .'assets/lib/font-awesome/css/all.min.css', [], $version );

        // enqueue CSS
        wp_enqueue_style( 'wpr-mega-menu-css', WPR_ADDONS_URL .'assets/css/admin/mega-menu.css', [], $version );

        // enqueue JS
        wp_enqueue_script( 'wpr-mega-menu-js', WPR_ADDONS_URL .'assets/js/admin/mega-menu.js', ['jquery'], $version );

        wp_localize_script( 
            'wpr-mega-menu-js',
            'WprMegaMenuSettingsData',
            [
                'settingsData' => get_menu_items_settings(),
				'nonce' => wp_create_nonce( 'wpr-mega-menu-js' ),
            ]
        );

    }

}