<?php
/**
 * Plugin Name: Poll Manager
 * Plugin URI: https://example.com
 * Description: Create polls, collect responses, and view results on an admin dashboard
 * Version: 1.0.0
 * Author: Your Name
 * License: GPL v2 or later
 */

// Prevent direct access
if (!defined('ABSPATH')) exit;

class PollManager {
    
    public function __construct() {
        register_activation_hook(__FILE__, [$this, 'activate']);
        add_action('admin_menu', [$this, 'add_admin_menu']);
        add_action('admin_enqueue_scripts', [$this, 'enqueue_admin_scripts']);
        add_shortcode('poll', [$this, 'poll_shortcode']);
        add_action('wp_ajax_submit_poll', [$this, 'submit_poll']);
        add_action('wp_ajax_nopriv_submit_poll', [$this, 'submit_poll']);
        add_action('wp_enqueue_scripts', [$this, 'enqueue_frontend_scripts']);
    }
    
    public function activate() {
        global $wpdb;
        $charset_collate = $wpdb->get_charset_collate();
        
        // Polls table
        $sql1 = "CREATE TABLE IF NOT EXISTS {$wpdb->prefix}polls (
            id mediumint(9) NOT NULL AUTO_INCREMENT,
            title varchar(255) NOT NULL,
            question text NOT NULL,
            created_at datetime DEFAULT CURRENT_TIMESTAMP,
            status varchar(20) DEFAULT 'active',
            PRIMARY KEY  (id)
        ) $charset_collate;";
        
        // Poll options table
        $sql2 = "CREATE TABLE IF NOT EXISTS {$wpdb->prefix}poll_options (
            id mediumint(9) NOT NULL AUTO_INCREMENT,
            poll_id mediumint(9) NOT NULL,
            option_text varchar(255) NOT NULL,
            votes int(11) DEFAULT 0,
            PRIMARY KEY  (id)
        ) $charset_collate;";
        
        // Poll responses table
        $sql3 = "CREATE TABLE IF NOT EXISTS {$wpdb->prefix}poll_responses (
            id mediumint(9) NOT NULL AUTO_INCREMENT,
            poll_id mediumint(9) NOT NULL,
            option_id mediumint(9) NOT NULL,
            user_ip varchar(45),
            user_id mediumint(9),
            responded_at datetime DEFAULT CURRENT_TIMESTAMP,
            PRIMARY KEY  (id)
        ) $charset_collate;";
        
        require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
        dbDelta($sql1);
        dbDelta($sql2);
        dbDelta($sql3);
    }
    
    public function add_admin_menu() {
        add_menu_page(
            'Poll Manager',
            'Polls',
            'manage_options',
            'poll-manager',
            [$this, 'dashboard_page'],
            'dashicons-chart-bar',
            30
        );
        
        add_submenu_page(
            'poll-manager',
            'Add New Poll',
            'Add New',
            'manage_options',
            'poll-manager-new',
            [$this, 'new_poll_page']
        );
    }
    
    public function enqueue_admin_scripts($hook) {
        if (strpos($hook, 'poll-manager') === false) return;
        
        wp_enqueue_style('poll-manager-admin', plugin_dir_url(__FILE__) . 'admin-style.css');
        wp_enqueue_script('chart-js', 'https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.9.1/chart.min.js', [], '3.9.1', true);
    }
    
    public function enqueue_frontend_scripts() {
        wp_enqueue_style('poll-manager-frontend', plugin_dir_url(__FILE__) . 'frontend-style.css');
        wp_enqueue_script('poll-manager-frontend', plugin_dir_url(__FILE__) . 'frontend-script.js', ['jquery'], '1.0', true);
        wp_localize_script('poll-manager-frontend', 'pollAjax', [
            'ajax_url' => admin_url('admin-ajax.php'),
            'nonce' => wp_create_nonce('poll_nonce')
        ]);
    }
    
    public function dashboard_page() {
        global $wpdb;
        
        // Handle delete action
        if (isset($_GET['action']) && $_GET['action'] === 'delete' && isset($_GET['poll_id'])) {
            $poll_id = intval($_GET['poll_id']);
            $wpdb->delete("{$wpdb->prefix}polls", ['id' => $poll_id]);
            $wpdb->delete("{$wpdb->prefix}poll_options", ['poll_id' => $poll_id]);
            $wpdb->delete("{$wpdb->prefix}poll_responses", ['poll_id' => $poll_id]);
            echo '<div class="notice notice-success"><p>Poll deleted successfully!</p></div>';
        }
        
        $polls = $wpdb->get_results("SELECT * FROM {$wpdb->prefix}polls ORDER BY created_at DESC");
        
        ?>
        <div class="wrap">
            <h1>Poll Dashboard</h1>
            
            <?php if (empty($polls)): ?>
                <p>No polls found. <a href="<?php echo admin_url('admin.php?page=poll-manager-new'); ?>">Create your first poll</a></p>
            <?php else: ?>
                
                <div class="poll-stats">
                    <?php foreach ($polls as $poll): 
                        $options = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$wpdb->prefix}poll_options WHERE poll_id = %d", $poll->id));
                        $total_votes = array_sum(array_column($options, 'votes'));
                    ?>
                        <div class="poll-card">
                            <h2><?php echo esc_html($poll->title); ?></h2>
                            <p><strong>Question:</strong> <?php echo esc_html($poll->question); ?></p>
                            <p><strong>Total Votes:</strong> <?php echo $total_votes; ?></p>
                            <p><strong>Status:</strong> <span class="status-<?php echo $poll->status; ?>"><?php echo ucfirst($poll->status); ?></span></p>
                            
                            <div class="chart-container">
                                <canvas id="chart-<?php echo $poll->id; ?>"></canvas>
                            </div>
                            
                            <div class="poll-options-list">
                                <?php foreach ($options as $option): 
                                    $percentage = $total_votes > 0 ? round(($option->votes / $total_votes) * 100, 1) : 0;
                                ?>
                                    <div class="option-row">
                                        <span><?php echo esc_html($option->option_text); ?></span>
                                        <span><?php echo $option->votes; ?> votes (<?php echo $percentage; ?>%)</span>
                                    </div>
                                <?php endforeach; ?>
                            </div>
                            
                            <h3>Recent Responses</h3>
                            <div class="responses-list">
                                <?php
                                $responses = $wpdb->get_results($wpdb->prepare(
                                    "SELECT r.*, o.option_text 
                                    FROM {$wpdb->prefix}poll_responses r 
                                    JOIN {$wpdb->prefix}poll_options o ON r.option_id = o.id 
                                    WHERE r.poll_id = %d 
                                    ORDER BY r.responded_at DESC 
                                    LIMIT 20",
                                    $poll->id
                                ));
                                
                                if (!empty($responses)):
                                ?>
                                    <table class="wp-list-table widefat fixed striped">
                                        <thead>
                                            <tr>
                                                <th>User</th>
                                                <th>Response</th>
                                                <th>Date/Time</th>
                                            </tr>
                                        </thead>
                                        <tbody>
                                            <?php foreach ($responses as $response): 
                                                // Get user info
                                                $user_display = 'Guest';
                                                if ($response->user_id > 0) {
                                                    $user = get_userdata($response->user_id);
                                                    if ($user) {
                                                        $user_display = $user->display_name . ' (' . $user->user_email . ')';
                                                    }
                                                } else {
                                                    $user_display = 'Guest (IP: ' . esc_html($response->user_ip) . ')';
                                                }
                                            ?>
                                                <tr>
                                                    <td><?php echo $user_display; ?></td>
                                                    <td><strong><?php echo esc_html($response->option_text); ?></strong></td>
                                                    <td><?php echo date('M j, Y g:i A', strtotime($response->responded_at)); ?></td>
                                                </tr>
                                            <?php endforeach; ?>
                                        </tbody>
                                    </table>
                                <?php else: ?>
                                    <p>No responses yet.</p>
                                <?php endif; ?>
                            </div>
                            
                            <p><strong>Shortcode:</strong> <code>[poll id="<?php echo $poll->id; ?>"]</code></p>
                            
                            <a href="<?php echo admin_url('admin.php?page=poll-manager&action=delete&poll_id=' . $poll->id); ?>" 
                               class="button button-small button-link-delete" 
                               onclick="return confirm('Are you sure you want to delete this poll?')">Delete</a>
                        </div>
                        
                        <script>
                        (function() {
                            var ctx = document.getElementById('chart-<?php echo $poll->id; ?>').getContext('2d');
                            new Chart(ctx, {
                                type: 'bar',
                                data: {
                                    labels: <?php echo json_encode(array_column($options, 'option_text')); ?>,
                                    datasets: [{
                                        label: 'Votes',
                                        data: <?php echo json_encode(array_column($options, 'votes')); ?>,
                                        backgroundColor: 'rgba(54, 162, 235, 0.8)',
                                        borderColor: 'rgba(54, 162, 235, 1)',
                                        borderWidth: 1
                                    }]
                                },
                                options: {
                                    responsive: true,
                                    maintainAspectRatio: false,
                                    scales: {
                                        y: {
                                            beginAtZero: true,
                                            ticks: {
                                                stepSize: 1
                                            }
                                        }
                                    }
                                }
                            });
                        })();
                        </script>
                    <?php endforeach; ?>
                </div>
                
            <?php endif; ?>
        </div>
        
        <style>
            .poll-stats { display: grid; grid-template-columns: repeat(auto-fill, minmax(450px, 1fr)); gap: 20px; margin-top: 20px; }
            .poll-card { background: #fff; padding: 20px; border: 1px solid #ccc; border-radius: 8px; }
            .poll-card h2 { margin-top: 0; color: #2271b1; }
            .chart-container { height: 250px; margin: 20px 0; }
            .option-row { display: flex; justify-content: space-between; padding: 8px 0; border-bottom: 1px solid #eee; }
            .status-active { color: green; font-weight: bold; }
            .status-inactive { color: red; font-weight: bold; }
        </style>
        <?php
    }
    
    public function new_poll_page() {
        global $wpdb;
        
        if (isset($_POST['create_poll'])) {
            $title = sanitize_text_field($_POST['poll_title']);
            $question = sanitize_textarea_field($_POST['poll_question']);
            $options = array_filter(array_map('sanitize_text_field', $_POST['poll_options']));
            
            if (!empty($title) && !empty($question) && count($options) >= 2) {
                $wpdb->insert("{$wpdb->prefix}polls", [
                    'title' => $title,
                    'question' => $question
                ]);
                
                $poll_id = $wpdb->insert_id;
                
                foreach ($options as $option) {
                    $wpdb->insert("{$wpdb->prefix}poll_options", [
                        'poll_id' => $poll_id,
                        'option_text' => $option
                    ]);
                }
                
                echo '<div class="notice notice-success"><p>Poll created successfully! Use shortcode: [poll id="' . $poll_id . '"]</p></div>';
            } else {
                echo '<div class="notice notice-error"><p>Please fill all fields and provide at least 2 options.</p></div>';
            }
        }
        ?>
        
        <div class="wrap">
            <h1>Create New Poll</h1>
            
            <form method="post" id="poll-form">
                <table class="form-table">
                    <tr>
                        <th><label for="poll_title">Poll Title</label></th>
                        <td><input type="text" id="poll_title" name="poll_title" class="regular-text" required></td>
                    </tr>
                    <tr>
                        <th><label for="poll_question">Question</label></th>
                        <td><textarea id="poll_question" name="poll_question" rows="3" class="large-text" required></textarea></td>
                    </tr>
                    <tr>
                        <th><label>Options</label></th>
                        <td>
                            <div id="options-container">
                                <input type="text" name="poll_options[]" class="regular-text" placeholder="Option 1" required><br><br>
                                <input type="text" name="poll_options[]" class="regular-text" placeholder="Option 2" required><br><br>
                            </div>
                            <button type="button" id="add-option" class="button">Add Another Option</button>
                        </td>
                    </tr>
                </table>
                
                <p class="submit">
                    <input type="submit" name="create_poll" class="button button-primary" value="Create Poll">
                </p>
            </form>
        </div>
        
        <script>
        document.getElementById('add-option').addEventListener('click', function() {
            var container = document.getElementById('options-container');
            var optionCount = container.querySelectorAll('input').length + 1;
            var input = document.createElement('input');
            input.type = 'text';
            input.name = 'poll_options[]';
            input.className = 'regular-text';
            input.placeholder = 'Option ' + optionCount;
            container.appendChild(input);
            container.appendChild(document.createElement('br'));
            container.appendChild(document.createElement('br'));
        });
        </script>
        <?php
    }
    
    public function poll_shortcode($atts) {
        global $wpdb;
        
        $atts = shortcode_atts(['id' => 0], $atts);
        $poll_id = intval($atts['id']);
        
        if (!$poll_id) return '<p>Invalid poll ID</p>';
        
        $poll = $wpdb->get_row($wpdb->prepare("SELECT * FROM {$wpdb->prefix}polls WHERE id = %d", $poll_id));
        if (!$poll) return '<p>Poll not found</p>';
        
        $options = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$wpdb->prefix}poll_options WHERE poll_id = %d", $poll_id));
        
        // Check if user already voted
        $user_ip = $_SERVER['REMOTE_ADDR'];
        $user_id = get_current_user_id();
        
        $already_voted = $wpdb->get_var($wpdb->prepare(
            "SELECT COUNT(*) FROM {$wpdb->prefix}poll_responses WHERE poll_id = %d AND (user_ip = %s OR user_id = %d)",
            $poll_id, $user_ip, $user_id
        ));
        
        ob_start();
        ?>
        <div class="poll-container" data-poll-id="<?php echo $poll_id; ?>">
            <h3><?php echo esc_html($poll->question); ?></h3>
            
            <?php if ($already_voted): ?>
                <p class="poll-message">You have already voted in this poll. Thank you!</p>
                <div class="poll-results">
                    <?php 
                    $total_votes = array_sum(array_column($options, 'votes'));
                    foreach ($options as $option): 
                        $percentage = $total_votes > 0 ? round(($option->votes / $total_votes) * 100, 1) : 0;
                    ?>
                        <div class="poll-result-item">
                            <div class="poll-result-label"><?php echo esc_html($option->option_text); ?></div>
                            <div class="poll-result-bar">
                                <div class="poll-result-fill" style="width: <?php echo $percentage; ?>%"></div>
                            </div>
                            <div class="poll-result-percent"><?php echo $percentage; ?>% (<?php echo $option->votes; ?> votes)</div>
                        </div>
                    <?php endforeach; ?>
                </div>
            <?php else: ?>
                <form class="poll-form">
                    <?php foreach ($options as $option): ?>
                        <label class="poll-option">
                            <input type="radio" name="poll_option" value="<?php echo $option->id; ?>" required>
                            <span><?php echo esc_html($option->option_text); ?></span>
                        </label>
                    <?php endforeach; ?>
                    <button type="submit" class="poll-submit-btn">Submit Vote</button>
                    <div class="poll-message"></div>
                </form>
            <?php endif; ?>
        </div>
        <?php
        return ob_get_clean();
    }
    
    public function submit_poll() {
        check_ajax_referer('poll_nonce', 'nonce');
        
        global $wpdb;
        
        $poll_id = intval($_POST['poll_id']);
        $option_id = intval($_POST['option_id']);
        $user_ip = $_SERVER['REMOTE_ADDR'];
        $user_id = get_current_user_id();
        
        // Check if already voted
        $already_voted = $wpdb->get_var($wpdb->prepare(
            "SELECT COUNT(*) FROM {$wpdb->prefix}poll_responses WHERE poll_id = %d AND (user_ip = %s OR user_id = %d)",
            $poll_id, $user_ip, $user_id
        ));
        
        if ($already_voted) {
            wp_send_json_error(['message' => 'You have already voted in this poll.']);
        }
        
        // Record vote
        $wpdb->insert("{$wpdb->prefix}poll_responses", [
            'poll_id' => $poll_id,
            'option_id' => $option_id,
            'user_ip' => $user_ip,
            'user_id' => $user_id
        ]);
        
        // Update vote count
        $wpdb->query($wpdb->prepare(
            "UPDATE {$wpdb->prefix}poll_options SET votes = votes + 1 WHERE id = %d",
            $option_id
        ));
        
        // Get updated results
        $options = $wpdb->get_results($wpdb->prepare(
            "SELECT * FROM {$wpdb->prefix}poll_options WHERE poll_id = %d",
            $poll_id
        ));
        
        $total_votes = array_sum(array_column($options, 'votes'));
        $results = [];
        
        foreach ($options as $option) {
            $percentage = $total_votes > 0 ? round(($option->votes / $total_votes) * 100, 1) : 0;
            $results[] = [
                'text' => $option->option_text,
                'votes' => $option->votes,
                'percentage' => $percentage
            ];
        }
        
        wp_send_json_success([
            'message' => 'Thank you for voting!',
            'results' => $results
        ]);
    }
}

new PollManager();

// Create frontend-script.js file content
/*
jQuery(document).ready(function($) {
    $('.poll-form').on('submit', function(e) {
        e.preventDefault();
        
        var form = $(this);
        var container = form.closest('.poll-container');
        var pollId = container.data('poll-id');
        var optionId = form.find('input[name="poll_option"]:checked').val();
        
        if (!optionId) {
            form.find('.poll-message').text('Please select an option').css('color', 'red');
            return;
        }
        
        $.ajax({
            url: pollAjax.ajax_url,
            type: 'POST',
            data: {
                action: 'submit_poll',
                nonce: pollAjax.nonce,
                poll_id: pollId,
                option_id: optionId
            },
            success: function(response) {
                if (response.success) {
                    var resultsHtml = '<p class="poll-message">' + response.data.message + '</p><div class="poll-results">';
                    
                    response.data.results.forEach(function(result) {
                        resultsHtml += '<div class="poll-result-item">' +
                            '<div class="poll-result-label">' + result.text + '</div>' +
                            '<div class="poll-result-bar"><div class="poll-result-fill" style="width: ' + result.percentage + '%"></div></div>' +
                            '<div class="poll-result-percent">' + result.percentage + '% (' + result.votes + ' votes)</div>' +
                            '</div>';
                    });
                    
                    resultsHtml += '</div>';
                    container.find('form').replaceWith(resultsHtml);
                } else {
                    form.find('.poll-message').text(response.data.message).css('color', 'red');
                }
            }
        });
    });
});
*/

// Create frontend-style.css file content
/*
.poll-container {
    background: #f9f9f9;
    border: 1px solid #ddd;
    border-radius: 8px;
    padding: 20px;
    max-width: 600px;
    margin: 20px auto;
}

.poll-container h3 {
    margin-top: 0;
    color: #333;
}

.poll-option {
    display: block;
    padding: 10px;
    margin: 8px 0;
    background: #fff;
    border: 2px solid #ddd;
    border-radius: 4px;
    cursor: pointer;
    transition: all 0.3s;
}

.poll-option:hover {
    border-color: #2271b1;
    background: #f0f8ff;
}

.poll-option input[type="radio"] {
    margin-right: 10px;
}

.poll-submit-btn {
    background: #2271b1;
    color: #fff;
    border: none;
    padding: 10px 30px;
    border-radius: 4px;
    cursor: pointer;
    font-size: 16px;
    margin-top: 10px;
}

.poll-submit-btn:hover {
    background: #135e96;
}

.poll-message {
    margin-top: 15px;
    font-weight: bold;
    color: green;
}

.poll-results {
    margin-top: 20px;
}

.poll-result-item {
    margin-bottom: 15px;
}

.poll-result-label {
    font-weight: bold;
    margin-bottom: 5px;
}

.poll-result-bar {
    background: #e0e0e0;
    height: 30px;
    border-radius: 4px;
    overflow: hidden;
    margin-bottom: 5px;
}

.poll-result-fill {
    background: linear-gradient(90deg, #2271b1, #5496d1);
    height: 100%;
    transition: width 0.5s ease;
}

.poll-result-percent {
    color: #666;
    font-size: 14px;
}
*/
?>
