<?php
/**
 * Plugin Name: BW Inline Search
 * Plugin URI: https://bowdenworks.com
 * Description: Elegant inline search field that expands from a search icon. Use shortcode [bw_inline_search] or add the widget in Customizer.
 * Version: 1.1.0
 * Author: BowdenWorks
 * Author URI: https://bowdenworks.com
 * License: GPL v2 or later
 * License URI: https://www.gnu.org/licenses/gpl-2.0.html
 * Text Domain: bw-inline-search
 */

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

class BW_Inline_Search {

    private static $instance = null;

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

    private function __construct() {
        add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_assets' ) );
        add_action( 'wp_footer', array( $this, 'output_inline_search_html' ) );
        add_action( 'widgets_init', array( $this, 'register_widget' ) );
        add_shortcode( 'bw_inline_search', array( $this, 'shortcode_output' ) );
    }

    public function enqueue_assets() {
        wp_enqueue_style(
            'bw-inline-search',
            plugin_dir_url( __FILE__ ) . 'css/bw-inline-search.css',
            array(),
            '1.1.0'
        );

        wp_enqueue_script(
            'bw-inline-search',
            plugin_dir_url( __FILE__ ) . 'js/bw-inline-search.js',
            array(),
            '1.1.0',
            true
        );
    }

    /**
     * Shortcode: [bw_inline_search]
     * Attributes:
     *   - placeholder: Custom placeholder text (default: "Search...")
     *   - icon_color: Icon color (default: "currentColor")
     *   - theme: "light" or "dark" (default: "light")
     *   - align: "left", "center", or "right" (default: "left")
     */
    public function shortcode_output( $atts ) {
        $atts = shortcode_atts( array(
            'placeholder' => __( 'Search...', 'bw-inline-search' ),
            'icon_color'  => 'currentColor',
            'theme'       => 'light',
            'align'       => 'left',
        ), $atts, 'bw_inline_search' );

        $theme_class = ( $atts['theme'] === 'dark' ) ? 'bw-theme-dark' : '';
        $align_style = 'text-align: ' . esc_attr( $atts['align'] ) . ';';
        $icon_style  = 'color: ' . esc_attr( $atts['icon_color'] ) . ';';

        ob_start();
        ?>
        <div class="bw-inline-search-container bw-shortcode" style="<?php echo $align_style; ?>">
            <div class="bw-search-icon-wrapper" style="<?php echo $icon_style; ?>" data-bw-search-toggle>
                <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
                    <circle cx="11" cy="11" r="8"></circle>
                    <line x1="21" y1="21" x2="16.65" y2="16.65"></line>
                </svg>
            </div>
            <div class="bw-inline-search-wrapper <?php echo esc_attr( $theme_class ); ?>">
                <form role="search" method="get" class="bw-inline-search-form" action="<?php echo esc_url( home_url( '/' ) ); ?>">
                    <input type="search" class="bw-inline-search-input" placeholder="<?php echo esc_attr( $atts['placeholder'] ); ?>" value="" name="s" autocomplete="off" />
                    <button type="submit" class="bw-inline-search-submit" aria-label="<?php esc_attr_e( 'Submit search', 'bw-inline-search' ); ?>">
                        <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
                            <circle cx="11" cy="11" r="8"></circle>
                            <line x1="21" y1="21" x2="16.65" y2="16.65"></line>
                        </svg>
                    </button>
                </form>
            </div>
        </div>
        <?php
        return ob_get_clean();
    }

    /**
     * Register the widget
     */
    public function register_widget() {
        register_widget( 'BW_Inline_Search_Widget' );
    }

    public function output_inline_search_html() {
        ?>
        <!-- BW Inline Search Template (for JS auto-replacement of existing search toggles) -->
        <template id="bw-inline-search-template">
            <div class="bw-inline-search-wrapper">
                <form role="search" method="get" class="bw-inline-search-form" action="<?php echo esc_url( home_url( '/' ) ); ?>">
                    <input type="search" class="bw-inline-search-input" placeholder="<?php esc_attr_e( 'Search...', 'bw-inline-search' ); ?>" value="" name="s" autocomplete="off" />
                    <button type="submit" class="bw-inline-search-submit" aria-label="<?php esc_attr_e( 'Submit search', 'bw-inline-search' ); ?>">
                        <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
                            <circle cx="11" cy="11" r="8"></circle>
                            <line x1="21" y1="21" x2="16.65" y2="16.65"></line>
                        </svg>
                    </button>
                </form>
            </div>
        </template>
        <?php
    }
}

/**
 * BW Inline Search Widget
 */
class BW_Inline_Search_Widget extends WP_Widget {

    public function __construct() {
        parent::__construct(
            'bw_inline_search_widget',
            __( 'BW Inline Search', 'bw-inline-search' ),
            array(
                'description' => __( 'An elegant inline search that expands from an icon.', 'bw-inline-search' ),
                'classname'   => 'bw-inline-search-widget',
            )
        );
    }

    public function widget( $args, $instance ) {
        $placeholder = ! empty( $instance['placeholder'] ) ? $instance['placeholder'] : __( 'Search...', 'bw-inline-search' );
        $theme       = ! empty( $instance['theme'] ) ? $instance['theme'] : 'light';
        $icon_color  = ! empty( $instance['icon_color'] ) ? $instance['icon_color'] : 'currentColor';

        echo $args['before_widget'];

        $shortcode = sprintf(
            '[bw_inline_search placeholder="%s" theme="%s" icon_color="%s"]',
            esc_attr( $placeholder ),
            esc_attr( $theme ),
            esc_attr( $icon_color )
        );

        echo do_shortcode( $shortcode );

        echo $args['after_widget'];
    }

    public function form( $instance ) {
        $placeholder = ! empty( $instance['placeholder'] ) ? $instance['placeholder'] : __( 'Search...', 'bw-inline-search' );
        $theme       = ! empty( $instance['theme'] ) ? $instance['theme'] : 'light';
        $icon_color  = ! empty( $instance['icon_color'] ) ? $instance['icon_color'] : '';
        ?>
        <p>
            <label for="<?php echo esc_attr( $this->get_field_id( 'placeholder' ) ); ?>"><?php esc_html_e( 'Placeholder Text:', 'bw-inline-search' ); ?></label>
            <input class="widefat" id="<?php echo esc_attr( $this->get_field_id( 'placeholder' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'placeholder' ) ); ?>" type="text" value="<?php echo esc_attr( $placeholder ); ?>">
        </p>
        <p>
            <label for="<?php echo esc_attr( $this->get_field_id( 'theme' ) ); ?>"><?php esc_html_e( 'Theme:', 'bw-inline-search' ); ?></label>
            <select class="widefat" id="<?php echo esc_attr( $this->get_field_id( 'theme' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'theme' ) ); ?>">
                <option value="light" <?php selected( $theme, 'light' ); ?>><?php esc_html_e( 'Light', 'bw-inline-search' ); ?></option>
                <option value="dark" <?php selected( $theme, 'dark' ); ?>><?php esc_html_e( 'Dark', 'bw-inline-search' ); ?></option>
            </select>
        </p>
        <p>
            <label for="<?php echo esc_attr( $this->get_field_id( 'icon_color' ) ); ?>"><?php esc_html_e( 'Icon Color (CSS color):', 'bw-inline-search' ); ?></label>
            <input class="widefat" id="<?php echo esc_attr( $this->get_field_id( 'icon_color' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'icon_color' ) ); ?>" type="text" value="<?php echo esc_attr( $icon_color ); ?>" placeholder="e.g. #ffffff or currentColor">
        </p>
        <?php
    }

    public function update( $new_instance, $old_instance ) {
        $instance                = array();
        $instance['placeholder'] = ( ! empty( $new_instance['placeholder'] ) ) ? sanitize_text_field( $new_instance['placeholder'] ) : '';
        $instance['theme']       = ( ! empty( $new_instance['theme'] ) ) ? sanitize_text_field( $new_instance['theme'] ) : 'light';
        $instance['icon_color']  = ( ! empty( $new_instance['icon_color'] ) ) ? sanitize_text_field( $new_instance['icon_color'] ) : '';
        return $instance;
    }
}

// Initialize the plugin
BW_Inline_Search::get_instance();
