<?php
/**
 * Plugin Name: Acorn Cache Events
 * Description: Sends public content changes to the Nginx Cache plugin after WordPress finishes saving.
 */

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

// Keep the free plugin's filesystem purge and admin control, but defer automatic purges
// until the end of a public-content edit. Private inquiries must not flush page cache.
add_filter( 'nginx_cache_purge_actions', function() {
    return array( 'acorn_public_content_changed' );
} );

function acorn_cache_mark_changed() {
    $GLOBALS['acorn_cache_public_content_changed'] = true;
}

function acorn_cache_mark_post_changed( $post_id, $post = null ) {
    $type = $post instanceof WP_Post ? $post->post_type : get_post_type( $post_id );
    if ( ! $type || in_array( $type, array( 'acorn_inquiry', 'revision' ), true ) || wp_is_post_autosave( $post_id ) || wp_is_post_revision( $post_id ) ) {
        return;
    }
    acorn_cache_mark_changed();
}
add_action( 'save_post', 'acorn_cache_mark_post_changed', 1000, 2 );
add_action( 'before_delete_post', 'acorn_cache_mark_post_changed', 10, 2 );
add_action( 'wp_trash_post', 'acorn_cache_mark_post_changed' );
add_action( 'untrashed_post', 'acorn_cache_mark_post_changed' );
add_action( 'delete_attachment', 'acorn_cache_mark_post_changed' );

function acorn_cache_mark_post_meta_changed( $meta_id, $post_id, $meta_key ) {
    if ( is_string( $meta_key ) && str_starts_with( $meta_key, '_edit_' ) ) { return; }
    acorn_cache_mark_post_changed( $post_id );
}
add_action( 'added_post_meta', 'acorn_cache_mark_post_meta_changed', 10, 3 );
add_action( 'updated_post_meta', 'acorn_cache_mark_post_meta_changed', 10, 3 );
add_action( 'deleted_post_meta', 'acorn_cache_mark_post_meta_changed', 10, 3 );

add_action( 'comment_post', function( $comment_id, $approved ) {
    if ( '1' === (string) $approved ) { acorn_cache_mark_changed(); }
}, 10, 2 );
add_action( 'transition_comment_status', function( $new, $old ) {
    if ( 'approved' === $new || 'approved' === $old ) { acorn_cache_mark_changed(); }
}, 10, 2 );
add_action( 'edit_comment', function( $comment_id ) {
    if ( 'approved' === wp_get_comment_status( $comment_id ) ) { acorn_cache_mark_changed(); }
} );
add_action( 'delete_comment', function( $comment_id ) {
    if ( 'approved' === wp_get_comment_status( $comment_id ) ) { acorn_cache_mark_changed(); }
} );

foreach ( array( 'created_term', 'edited_term', 'delete_term', 'wp_update_nav_menu', 'customize_save_after', 'switch_theme', 'profile_update' ) as $hook ) {
    add_action( $hook, 'acorn_cache_mark_changed' );
}
function acorn_cache_mark_option_changed( $option ) {
    $public_options = array( 'blogname', 'blogdescription', 'show_on_front', 'page_on_front', 'page_for_posts', 'blog_public', 'permalink_structure', 'sidebars_widgets' );
    if ( in_array( $option, $public_options, true ) || str_starts_with( $option, 'theme_mods_' ) || str_starts_with( $option, 'widget_' ) ) {
        acorn_cache_mark_changed();
    }
}
add_action( 'updated_option', 'acorn_cache_mark_option_changed' );
add_action( 'added_option', 'acorn_cache_mark_option_changed' );
add_action( 'deleted_option', 'acorn_cache_mark_option_changed' );

add_action( 'shutdown', function() {
    if ( ! empty( $GLOBALS['acorn_cache_public_content_changed'] ) ) {
        do_action( 'acorn_public_content_changed' );
    }
}, PHP_INT_MAX );
