<?php

defined('ABSPATH') || exit;
function rocket_post_submitbox_start()
{
    if (current_user_can('rocket_purge_posts')) {
        global $post;
        $url = wp_nonce_url(admin_url('admin-post.php?action=purge_cache&type=post-' . $post->ID), 'purge_cache_post-' . $post->ID);
        printf('<div id="purge-action"><a class="button-secondary" href="%s">%s</a></div>', esc_url($url), esc_html__('Clear cache', 'rocket'));
    }
}
add_action('post_submitbox_start', 'rocket_post_submitbox_start');
function rocket_cache_options_meta_boxes()
{
    if (current_user_can('rocket_manage_options')) {
        $cpts = get_post_types(['public' => true], 'objects');
        unset($cpts['attachment']);
        foreach ($cpts as $cpt => $cpt_object) {
            $label = $cpt_object->labels->singular_name;
            add_meta_box('rocket_post_exclude', sprintf(__('WP Rocket Options', 'rocket'), $label), 'rocket_display_cache_options_meta_boxes', $cpt, 'side', 'core');
        }
    }
}
add_action('add_meta_boxes', 'rocket_cache_options_meta_boxes');
function rocket_display_cache_options_meta_boxes()
{
    if (current_user_can('rocket_manage_options')) {
        global $post, $pagenow;
        wp_nonce_field('rocket_box_option', '_rocketnonce', false, true);
        ?>

		<div class="misc-pub-section">
			<?php 
        $reject_current_uri = false;
        if ('post-new.php' !== $pagenow) {
            $rejected_uris = array_flip(get_rocket_option('cache_reject_uri', []));
            $path = rocket_clean_exclude_file(get_permalink($post->ID));
            if (isset($rejected_uris[$path])) {
                $reject_current_uri = true;
            }
        }
        ?>
			<input name="rocket_post_nocache" id="rocket_post_nocache" type="checkbox" title="<?php 
        esc_html_e('Never cache this page', 'rocket');
        ?>" <?php 
        checked($reject_current_uri, true);
        ?>><label for="rocket_post_nocache"><?php 
        esc_html_e('Never cache this page', 'rocket');
        ?></label>
		</div>

		<div class="misc-pub-section">
			<p><?php 
        esc_html_e('Activate these options on this post:', 'rocket');
        ?></p>
			<?php 
        $fields = ['lazyload' => __('LazyLoad for images', 'rocket'), 'lazyload_iframes' => __('LazyLoad for iframes/videos', 'rocket'), 'minify_css' => __('Minify/combine CSS', 'rocket'), 'remove_unused_css' => __('Remove Unused CSS', 'rocket'), 'minify_js' => __('Minify/combine JS', 'rocket'), 'cdn' => __('CDN', 'rocket'), 'async_css' => __('Optimize CSS Delivery', 'rocket'), 'defer_all_js' => __('Defer JS', 'rocket'), 'delay_js' => __('Delay JavaScript execution', 'rocket')];
        foreach ($fields as $field => $label) {
            $disabled = disabled(!get_rocket_option($field), true, false);
            $title = $disabled ? ' title="' . esc_attr(sprintf(__('Activate first the %s option.', 'rocket'), $label)) . '"' : '';
            $class = $disabled ? ' class="rkt-disabled"' : '';
            $checked = !$disabled ? checked(!get_post_meta($post->ID, '_rocket_exclude_' . $field, true), true, false) : '';
            ?>

				<input name="rocket_post_exclude_hidden[<?php 
            echo esc_attr($field);
            ?>]" type="hidden" value="on">
				<input name="rocket_post_exclude[<?php 
            echo esc_attr($field);
            ?>]" id="rocket_post_exclude_<?php 
            echo esc_attr($field);
            ?>" type="checkbox"<?php 
            echo $title;
            echo $checked;
            echo $disabled;
            ?>>
				<label for="rocket_post_exclude_<?php 
            echo esc_attr($field);
            ?>"<?php 
            echo $title;
            echo $class;
            ?>><?php 
            echo esc_html($label);
            ?></label><br>

				<?php 
        }
        ?>

			<p class="rkt-note">
			<?php 
        printf(esc_html__('%1$sNote:%2$s None of these options will be applied if this post has been excluded from cache in the global cache settings.', 'rocket'), '<strong>', '</strong>');
        ?>
			</p>
		</div>

		<?php 
        do_action('rocket_after_options_metabox');
    }
}
function rocket_save_metabox_options()
{
    if (current_user_can('rocket_manage_options') && isset($_POST['post_ID'], $_POST['rocket_post_exclude_hidden'], $_POST['_rocketnonce'])) {
        check_admin_referer('rocket_box_option', '_rocketnonce');
        if (isset($_POST['post_status']) && 'publish' === $_POST['post_status']) {
            $new_cache_reject_uri = $cache_reject_uri = get_rocket_option('cache_reject_uri');
            $rejected_uris = array_flip($cache_reject_uri);
            $path = rocket_clean_exclude_file(get_permalink((int) $_POST['post_ID']));
            if (isset($_POST['rocket_post_nocache'])) {
                if (!isset($rejected_uris[$path])) {
                    array_push($new_cache_reject_uri, $path);
                }
            } else {
                if (isset($rejected_uris[$path])) {
                    unset($new_cache_reject_uri[$rejected_uris[$path]]);
                }
            }
            if ($new_cache_reject_uri !== $cache_reject_uri) {
                update_rocket_option('cache_reject_uri', $new_cache_reject_uri);
                rocket_generate_config_file();
            }
        }
        $fields = ['lazyload', 'lazyload_iframes', 'minify_css', 'minify_js', 'cdn', 'async_css', 'defer_all_js', 'delay_js', 'remove_unused_css'];
        foreach ($fields as $field) {
            if (isset($_POST['rocket_post_exclude_hidden'][$field])) {
                if (isset($_POST['rocket_post_exclude'][$field])) {
                    delete_post_meta((int) $_POST['post_ID'], '_rocket_exclude_' . $field);
                } else {
                    if (get_rocket_option($field)) {
                        update_post_meta((int) $_POST['post_ID'], '_rocket_exclude_' . $field, true);
                    }
                }
            }
        }
    }
}
add_action('save_post', 'rocket_save_metabox_options');