<?php
/**
 * Plugin Name: Encore Member Search
 * Description: Provides a simple page to search for Encore members by name or email. Use shortcode [encore_member_search].
 * Version: 1.1
 * Author: Bowden Works
 */

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

class Encore_Member_Search {

    public function __construct() {
        add_shortcode('encore_member_search', [$this, 'render_shortcode']);
        add_action('wp_ajax_encore_search_members', [$this, 'ajax_search']);
        add_action('wp_ajax_nopriv_encore_search_members', [$this, 'ajax_search']);
        register_activation_hook(__FILE__, [$this, 'activate']);
    }

    public function activate() {
        // Create the page if it doesn't exist
        $page = get_page_by_path('encoreusers');
        if (!$page) {
            wp_insert_post([
                'post_title'     => 'Encore Member Search',
                'post_name'      => 'encoreusers',
                'post_content'   => '[encore_member_search]',
                'post_status'    => 'publish',
                'post_type'      => 'page',
                'comment_status' => 'closed',
                'ping_status'    => 'closed',
            ]);
        }
    }

    public function ajax_search() {
        $search = isset($_POST['search']) ? sanitize_text_field($_POST['search']) : '';

        if (strlen($search) < 2) {
            wp_send_json_success(['results' => [], 'message' => '']);
        }

        global $wpdb;

        // Split search into words for multi-word matching (e.g., "Rhonda Manning")
        $search_terms = preg_split('/\s+/', $search);

        if (count($search_terms) > 1) {
            // Multi-word search: each term must match somewhere in the user's data
            $where_clauses = [];
            $params = [];

            foreach ($search_terms as $term) {
                $like = '%' . $wpdb->esc_like($term) . '%';
                $where_clauses[] = "(u.user_email LIKE %s OR u.display_name LIKE %s OR fn.meta_value LIKE %s OR ln.meta_value LIKE %s)";
                $params[] = $like;
                $params[] = $like;
                $params[] = $like;
                $params[] = $like;
            }

            $where_sql = implode(' AND ', $where_clauses);

            $query = $wpdb->prepare("
                SELECT DISTINCT u.ID, u.user_email, u.display_name,
                       fn.meta_value as first_name,
                       ln.meta_value as last_name
                FROM {$wpdb->users} u
                LEFT JOIN {$wpdb->usermeta} fn ON u.ID = fn.user_id AND fn.meta_key = 'first_name'
                LEFT JOIN {$wpdb->usermeta} ln ON u.ID = ln.user_id AND ln.meta_key = 'last_name'
                WHERE $where_sql
                ORDER BY ln.meta_value, fn.meta_value
                LIMIT 15
            ", ...$params);
        } else {
            // Single word search with priority ordering
            $like = '%' . $wpdb->esc_like($search) . '%';

            $query = $wpdb->prepare("
                SELECT DISTINCT u.ID, u.user_email, u.display_name,
                       fn.meta_value as first_name,
                       ln.meta_value as last_name,
                       CASE
                           WHEN fn.meta_value LIKE %s THEN 1
                           WHEN ln.meta_value LIKE %s THEN 1
                           WHEN u.display_name LIKE %s THEN 2
                           ELSE 3
                       END as match_priority
                FROM {$wpdb->users} u
                LEFT JOIN {$wpdb->usermeta} fn ON u.ID = fn.user_id AND fn.meta_key = 'first_name'
                LEFT JOIN {$wpdb->usermeta} ln ON u.ID = ln.user_id AND ln.meta_key = 'last_name'
                WHERE u.user_email LIKE %s
                   OR u.display_name LIKE %s
                   OR u.user_login LIKE %s
                   OR fn.meta_value LIKE %s
                   OR ln.meta_value LIKE %s
                ORDER BY match_priority, ln.meta_value, fn.meta_value
                LIMIT 15
            ", $like, $like, $like, $like, $like, $like, $like, $like);
        }

        $users = $wpdb->get_results($query);

        $results = [];
        foreach ($users as $user) {
            $first = $user->first_name ?: '';
            $last = $user->last_name ?: '';
            $name = trim("$first $last");
            if (empty($name)) {
                $name = $user->display_name;
            }

            $results[] = [
                'name' => $name,
                'email' => $user->user_email,
            ];
        }

        wp_send_json_success(['results' => $results]);
    }

    public function render_shortcode($atts) {
        ob_start();
        ?>
        <style>
            /* Hide everything outside .content-wrap */
            .site-header,
            .site-footer,
            .site-header-wrap,
            .site-footer-wrap,
            #masthead,
            #colophon,
            .header-wrap,
            .footer-wrap,
            .site-branding,
            .main-navigation,
            .nav-menu,
            .sidebar,
            .widget-area,
            .site-info,
            .comments-area,
            .post-navigation,
            .yoast-breadcrumbs,
            .breadcrumb,
            .entry-meta,
            .entry-footer,
            .kb-row-layout-wrap,
            .bw-gcbc-trivia,
            .entry-hero,
            .page-hero-section,
            .bw_stamp,
            .sbi-critical-notice {
                display: none !important;
            }
            /* Hide Kadence elements that appear after content */
            .content-wrap ~ *,
            .content-wrap .kb-row-layout-wrap {
                display: none !important;
            }
            .content-wrap {
                padding: 40px 20px;
                max-width: 100%;
            }
            .site-main,
            .site-content,
            .entry-content {
                max-width: 100%;
                margin: 0 auto;
            }
            /* Simplify the page layout */
            .content-area {
                margin: 0;
            }
            .entry-content-wrap {
                padding: 0;
            }

            .encore-search-container {
                max-width: 600px;
                margin: 40px auto;
                text-align: center;
            }
            .encore-search-box {
                position: relative;
                margin-bottom: 30px;
            }
            #encore-member-search {
                width: 100%;
                padding: 20px 25px;
                font-size: 1.2rem;
                border: 2px solid #ddd;
                border-radius: 50px;
                outline: none;
                transition: border-color 0.2s;
                box-sizing: border-box;
            }
            #encore-member-search:focus {
                border-color: #0073aa;
            }
            #encore-member-search::placeholder {
                color: #999;
            }
            .encore-results {
                text-align: left;
                background: white;
                border-radius: 10px;
                box-shadow: 0 2px 10px rgba(0,0,0,0.1);
                overflow: hidden;
            }
            .encore-result-item {
                padding: 20px 25px;
                border-bottom: 1px solid #eee;
            }
            .encore-result-item:last-child {
                border-bottom: none;
            }
            .encore-result-item .encore-name {
                font-weight: 600;
                color: #2e7d32;
                font-size: 1.1rem;
            }
            .encore-result-item .encore-status {
                color: #666;
                font-size: 0.95rem;
                margin-top: 5px;
            }
            .encore-no-results {
                padding: 30px;
                color: #666;
                text-align: center;
            }
            .encore-loading {
                padding: 30px;
                color: #999;
                text-align: center;
            }
            .encore-hint {
                color: #999;
                font-size: 0.9rem;
                margin-top: 15px;
            }

            /* Celebration effect for single match */
            .encore-celebrate {
                animation: celebrate-pulse 0.5s ease-out;
            }
            .encore-celebrate .encore-result-item {
                background: linear-gradient(135deg, #e8f5e9 0%, #c8e6c9 100%);
                border: 2px solid #4caf50;
                border-radius: 10px;
            }
            .encore-celebrate .encore-name {
                font-size: 1.3rem !important;
                color: #1b5e20 !important;
            }
            .encore-celebrate .encore-status {
                font-size: 1.1rem !important;
                color: #2e7d32 !important;
                font-weight: 600;
            }
            @keyframes celebrate-pulse {
                0% { transform: scale(0.95); opacity: 0.5; }
                50% { transform: scale(1.02); }
                100% { transform: scale(1); opacity: 1; }
            }

            /* Confetti container */
            .confetti-container {
                position: fixed;
                top: 0;
                left: 0;
                width: 100%;
                height: 100%;
                pointer-events: none;
                overflow: hidden;
                z-index: 9999;
            }
            .confetti {
                position: absolute;
                width: 10px;
                height: 10px;
                opacity: 0;
            }
            @keyframes confetti-fall {
                0% { transform: translateY(-100px) rotate(0deg); opacity: 1; }
                100% { transform: translateY(100vh) rotate(720deg); opacity: 0; }
            }
        </style>

        <div class="encore-search-container">
            <div class="encore-search-box">
                <input type="text" id="encore-member-search" placeholder="Search by name or email..." autocomplete="off" autofocus>
            </div>
            <div id="encore-results"></div>
            <p class="encore-hint" id="encore-hint">Type at least 2 characters to search</p>
        </div>

        <script>
            (function() {
                const searchInput = document.getElementById('encore-member-search');
                const resultsDiv = document.getElementById('encore-results');
                const hintDiv = document.getElementById('encore-hint');
                let debounceTimer;
                let lastResultCount = 0;

                if (!searchInput) return;

                searchInput.addEventListener('input', function() {
                    clearTimeout(debounceTimer);
                    const query = this.value.trim();

                    if (query.length < 2) {
                        resultsDiv.innerHTML = '';
                        hintDiv.style.display = 'block';
                        lastResultCount = 0;
                        return;
                    }

                    hintDiv.style.display = 'none';
                    resultsDiv.innerHTML = '<div class="encore-loading">Searching...</div>';

                    debounceTimer = setTimeout(function() {
                        const formData = new FormData();
                        formData.append('action', 'encore_search_members');
                        formData.append('search', query);

                        fetch('<?php echo esc_url(admin_url('admin-ajax.php')); ?>', {
                            method: 'POST',
                            body: formData
                        })
                        .then(response => response.json())
                        .then(data => {
                            if (data.success && data.data.results.length > 0) {
                                const isSingleResult = data.data.results.length === 1;
                                const celebrateClass = isSingleResult ? ' encore-celebrate' : '';

                                let html = '<div class="encore-results' + celebrateClass + '">';
                                data.data.results.forEach(function(user) {
                                    html += '<div class="encore-result-item">';
                                    html += '<div class="encore-name">' + escapeHtml(user.name) + ' : ' + escapeHtml(user.email) + '</div>';
                                    html += '<div class="encore-status">is an Encore Member!' + (isSingleResult ? ' 🎉' : '') + '</div>';
                                    html += '</div>';
                                });
                                html += '</div>';
                                resultsDiv.innerHTML = html;

                                // Trigger confetti only when narrowing down to exactly 1 result
                                if (isSingleResult && lastResultCount !== 1) {
                                    launchConfetti();
                                }
                                lastResultCount = data.data.results.length;
                            } else {
                                resultsDiv.innerHTML = '<div class="encore-results"><div class="encore-no-results">No members found matching your search</div></div>';
                                lastResultCount = 0;
                            }
                        })
                        .catch(error => {
                            resultsDiv.innerHTML = '<div class="encore-results"><div class="encore-no-results">Error searching. Please try again.</div></div>';
                            lastResultCount = 0;
                        });
                    }, 300);
                });

                function escapeHtml(text) {
                    const div = document.createElement('div');
                    div.textContent = text;
                    return div.innerHTML;
                }

                function launchConfetti() {
                    const container = document.createElement('div');
                    container.className = 'confetti-container';
                    document.body.appendChild(container);

                    const colors = ['#ff6b6b', '#4ecdc4', '#45b7d1', '#96ceb4', '#ffeaa7', '#dfe6e9', '#fd79a8', '#a29bfe'];
                    const shapes = ['square', 'circle'];

                    for (let i = 0; i < 80; i++) {
                        const confetti = document.createElement('div');
                        confetti.className = 'confetti';
                        confetti.style.left = Math.random() * 100 + '%';
                        confetti.style.backgroundColor = colors[Math.floor(Math.random() * colors.length)];
                        confetti.style.borderRadius = shapes[Math.floor(Math.random() * shapes.length)] === 'circle' ? '50%' : '0';
                        confetti.style.width = (Math.random() * 10 + 5) + 'px';
                        confetti.style.height = confetti.style.width;
                        confetti.style.animation = 'confetti-fall ' + (Math.random() * 2 + 1.5) + 's ease-out forwards';
                        confetti.style.animationDelay = Math.random() * 0.5 + 's';
                        container.appendChild(confetti);
                    }

                    setTimeout(function() {
                        container.remove();
                    }, 4000);
                }
            })();
        </script>
        <?php
        return ob_get_clean();
    }
}

new Encore_Member_Search();
