<?php
/**
 * Plugin Name: BW Featured Image
 * Description: Provides a default featured image for posts that don't have one set.
 * Version: 1.0.0
 * Author: Bowden Works
 * Author URI: https://bowdenworks.com/
 * License: GPL v2 or later
 */

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

class BW_Featured_Image {

    private static $instance = null;

    public static function get_instance() {
        if (self::$instance === null) {
            self::$instance = new self();
        }
        return self::$instance;
    }

    private function __construct() {
        add_action('admin_menu', array($this, 'add_settings_page'));
        add_action('admin_init', array($this, 'register_settings'));
        add_action('admin_enqueue_scripts', array($this, 'enqueue_admin_scripts'));
        add_filter('post_thumbnail_html', array($this, 'filter_post_thumbnail_html'), 10, 5);
        add_filter('get_post_metadata', array($this, 'filter_post_metadata'), 10, 4);
    }

    public function add_settings_page() {
        add_options_page(
            'BW Featured Image Settings',
            'BW Featured Image',
            'manage_options',
            'bw-featured-image',
            array($this, 'render_settings_page')
        );
    }

    public function register_settings() {
        register_setting('bw_featured_image_options', 'bw_featured_image_id', array(
            'type' => 'integer',
            'sanitize_callback' => 'absint',
            'default' => 0,
        ));

        add_settings_section(
            'bw_featured_image_section',
            'Default Featured Image',
            array($this, 'render_section_description'),
            'bw-featured-image'
        );

        add_settings_field(
            'bw_featured_image_field',
            'Select Default Image',
            array($this, 'render_image_field'),
            'bw-featured-image',
            'bw_featured_image_section'
        );
    }

    public function enqueue_admin_scripts($hook) {
        if ($hook !== 'settings_page_bw-featured-image') {
            return;
        }

        wp_enqueue_media();
        wp_enqueue_script(
            'bw-featured-image-admin',
            plugin_dir_url(__FILE__) . 'admin.js',
            array('jquery'),
            '1.0.0',
            true
        );
        wp_enqueue_style(
            'bw-featured-image-admin',
            plugin_dir_url(__FILE__) . 'admin.css',
            array(),
            '1.0.0'
        );
    }

    public function render_section_description() {
        echo '<p>Select a default featured image that will be used when a post does not have a featured image set.</p>';
    }

    public function render_image_field() {
        $image_id = get_option('bw_featured_image_id', 0);
        $image_url = '';

        if ($image_id) {
            $image_url = wp_get_attachment_image_url($image_id, 'medium');
        }
        ?>
        <div class="bw-featured-image-wrapper">
            <input type="hidden" name="bw_featured_image_id" id="bw_featured_image_id" value="<?php echo esc_attr($image_id); ?>">
            <div id="bw-featured-image-preview">
                <?php if ($image_url): ?>
                    <img src="<?php echo esc_url($image_url); ?>" alt="Default featured image">
                <?php endif; ?>
            </div>
            <p>
                <button type="button" class="button" id="bw-select-image">
                    <?php echo $image_id ? 'Change Image' : 'Select Image'; ?>
                </button>
                <?php if ($image_id): ?>
                    <button type="button" class="button" id="bw-remove-image">Remove Image</button>
                <?php endif; ?>
            </p>
        </div>
        <?php
    }

    public function render_settings_page() {
        if (!current_user_can('manage_options')) {
            return;
        }
        ?>
        <div class="wrap">
            <h1><?php echo esc_html(get_admin_page_title()); ?></h1>
            <form method="post" action="options.php">
                <?php
                settings_fields('bw_featured_image_options');
                do_settings_sections('bw-featured-image');
                submit_button('Save Settings');
                ?>
            </form>
        </div>
        <?php
    }

    public function filter_post_thumbnail_html($html, $post_id, $post_thumbnail_id, $size, $attr) {
        if (!empty($html)) {
            return $html;
        }

        $default_image_id = get_option('bw_featured_image_id', 0);

        if (!$default_image_id) {
            return $html;
        }

        return wp_get_attachment_image($default_image_id, $size, false, $attr);
    }

    public function filter_post_metadata($value, $object_id, $meta_key, $single) {
        if ($meta_key !== '_thumbnail_id') {
            return $value;
        }

        if ($value !== null) {
            return $value;
        }

        $post = get_post($object_id);
        if (!$post || $post->post_type !== 'post') {
            return $value;
        }

        remove_filter('get_post_metadata', array($this, 'filter_post_metadata'), 10);
        $existing = get_post_meta($object_id, '_thumbnail_id', true);
        add_filter('get_post_metadata', array($this, 'filter_post_metadata'), 10, 4);

        if ($existing) {
            return $value;
        }

        $default_image_id = get_option('bw_featured_image_id', 0);

        if (!$default_image_id) {
            return $value;
        }

        if ($single) {
            return $default_image_id;
        }

        return array($default_image_id);
    }
}

BW_Featured_Image::get_instance();
