<?php
/**
 * Plugin Name: Canadian Fishing Spots Generator
 * Description: A plugin to generate and display Canadian fishing spots
 * Version: 1.0
 * Author: Your Name
 */

// Prevent direct access
if (!defined('ABSPATH')) {
    exit;
}

// Create custom post type for fishing spots
function fishing_spots_post_type() {
    register_post_type('fishing_spot',
        array(
            'labels' => array(
                'name' => __('Fishing Spots'),
                'singular_name' => __('Fishing Spot')
            ),
            'public' => true,
            'has_archive' => true,
            'supports' => array('title', 'editor', 'thumbnail', 'custom-fields', 'comments'),
            'taxonomies' => array('category', 'post_tag'),
            'menu_icon' => 'dashicons-location-alt'
        )
    );
}
add_action('init', 'fishing_spots_post_type');

// Add custom meta boxes for fishing spot details
function fishing_spot_meta_boxes() {
    add_meta_box(
        'fishing_spot_location',
        'Location Information',
        'fishing_spot_location_callback',
        'fishing_spot'
    );
    
    add_meta_box(
        'fishing_spot_water',
        'Water Information',
        'fishing_spot_water_callback',
        'fishing_spot'
    );
    
    add_meta_box(
        'fishing_spot_fish',
        'Fish Species',
        'fishing_spot_fish_callback',
        'fishing_spot'
    );
    
    add_meta_box(
        'fishing_spot_regulations',
        'Regulations',
        'fishing_spot_regulations_callback',
        'fishing_spot'
    );
    
    add_meta_box(
        'fishing_spot_facilities',
        'Facilities',
        'fishing_spot_facilities_callback',
        'fishing_spot'
    );
}
add_action('add_meta_boxes', 'fishing_spot_meta_boxes');

// Location information meta box
function fishing_spot_location_callback($post) {
    wp_nonce_field('fishing_spot_save_meta', 'fishing_spot_meta_nonce');
    
    $province = get_post_meta($post->ID, '_province', true);
    $latitude = get_post_meta($post->ID, '_latitude', true);
    $longitude = get_post_meta($post->ID, '_longitude', true);
    $nearest_town = get_post_meta($post->ID, '_nearest_town', true);
    $access_notes = get_post_meta($post->ID, '_access_notes', true);
    
    echo '<p><label for="province">Province:</label> ';
    echo '<select id="province" name="province">
        <option value="">Select Province</option>
        <option value="Alberta" ' . selected($province, 'Alberta', false) . '>Alberta</option>
        <option value="British Columbia" ' . selected($province, 'British Columbia', false) . '>British Columbia</option>
        <option value="Manitoba" ' . selected($province, 'Manitoba', false) . '>Manitoba</option>
        <option value="New Brunswick" ' . selected($province, 'New Brunswick', false) . '>New Brunswick</option>
        <option value="Newfoundland and Labrador" ' . selected($province, 'Newfoundland and Labrador', false) . '>Newfoundland and Labrador</option>
        <option value="Northwest Territories" ' . selected($province, 'Northwest Territories', false) . '>Northwest Territories</option>
        <option value="Nova Scotia" ' . selected($province, 'Nova Scotia', false) . '>Nova Scotia</option>
        <option value="Nunavut" ' . selected($province, 'Nunavut', false) . '>Nunavut</option>
        <option value="Ontario" ' . selected($province, 'Ontario', false) . '>Ontario</option>
        <option value="Prince Edward Island" ' . selected($province, 'Prince Edward Island', false) . '>Prince Edward Island</option>
        <option value="Quebec" ' . selected($province, 'Quebec', false) . '>Quebec</option>
        <option value="Saskatchewan" ' . selected($province, 'Saskatchewan', false) . '>Saskatchewan</option>
        <option value="Yukon" ' . selected($province, 'Yukon', false) . '>Yukon</option>
    </select></p>';
    
    echo '<p><label for="latitude">Latitude:</label> ';
    echo '<input type="text" id="latitude" name="latitude" value="' . esc_attr($latitude) . '" /></p>';
    
    echo '<p><label for="longitude">Longitude:</label> ';
    echo '<input type="text" id="longitude" name="longitude" value="' . esc_attr($longitude) . '" /></p>';
    
    echo '<p><label for="nearest_town">Nearest Town:</label> ';
    echo '<input type="text" id="nearest_town" name="nearest_town" value="' . esc_attr($nearest_town) . '" /></p>';
    
    echo '<p><label for="access_notes">Access Notes:</label> ';
    echo '<textarea id="access_notes" name="access_notes" rows="4" cols="50">' . esc_textarea($access_notes) . '</textarea></p>';
}

// Functions for other meta boxes would be defined similarly

// Save meta data
function fishing_spot_save_meta($post_id) {
    if (!isset($_POST['fishing_spot_meta_nonce']) || !wp_verify_nonce($_POST['fishing_spot_meta_nonce'], 'fishing_spot_save_meta')) {
        return;
    }
    
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return;
    }
    
    if (!current_user_can('edit_post', $post_id)) {
        return;
    }
    
    // Save location data
    if (isset($_POST['province'])) {
        update_post_meta($post_id, '_province', sanitize_text_field($_POST['province']));
    }
    
    if (isset($_POST['latitude'])) {
        update_post_meta($post_id, '_latitude', sanitize_text_field($_POST['latitude']));
    }
    
    if (isset($_POST['longitude'])) {
        update_post_meta($post_id, '_longitude', sanitize_text_field($_POST['longitude']));
    }
    
    if (isset($_POST['nearest_town'])) {
        update_post_meta($post_id, '_nearest_town', sanitize_text_field($_POST['nearest_town']));
    }
    
    if (isset($_POST['access_notes'])) {
        update_post_meta($post_id, '_access_notes', sanitize_textarea_field($_POST['access_notes']));
    }
    
    // Save other meta data fields similarly
}
add_action('save_post_fishing_spot', 'fishing_spot_save_meta');

// Shortcode to display fishing spots
function fishing_spots_shortcode($atts) {
    $atts = shortcode_atts(array(
        'province' => '',
        'fish_type' => '',
        'max' => 10
    ), $atts);
    
    $args = array(
        'post_type' => 'fishing_spot',
        'posts_per_page' => $atts['max']
    );
    
    // Add meta query for province if specified
    if (!empty($atts['province'])) {
        $args['meta_query'][] = array(
            'key' => '_province',
            'value' => $atts['province'],
            'compare' => '='
        );
    }
    
    // Add taxonomy query for fish type if specified
    if (!empty($atts['fish_type'])) {
        $args['tax_query'][] = array(
            'taxonomy' => 'post_tag',
            'field' => 'slug',
            'terms' => $atts['fish_type']
        );
    }
    
    $query = new WP_Query($args);
    
    $output = '<div class="fishing-spots-container">';
    
    if ($query->have_posts()) {
        while ($query->have_posts()) {
            $query->the_post();
            $id = get_the_ID();
            
            $output .= '<div class="fishing-spot">';
            $output .= '<h2><a href="' . get_permalink() . '">' . get_the_title() . '</a></h2>';
            
            if (has_post_thumbnail()) {
                $output .= '<div class="fishing-spot-image">' . get_the_post_thumbnail($id, 'medium') . '</div>';
            }
            
            $province = get_post_meta($id, '_province', true);
            $nearest_town = get_post_meta($id, '_nearest_town', true);
            
            $output .= '<div class="fishing-spot-meta">';
            $output .= '<p><strong>Province:</strong> ' . esc_html($province) . '</p>';
            $output .= '<p><strong>Nearest Town:</strong> ' . esc_html($nearest_town) . '</p>';
            $output .= '</div>';
            
            $output .= '<div class="fishing-spot-excerpt">' . get_the_excerpt() . '</div>';
            $output .= '<a href="' . get_permalink() . '" class="fishing-spot-link">View Details</a>';
            $output .= '</div>';
        }
    } else {
        $output .= '<p>No fishing spots found.</p>';
    }
    
    wp_reset_postdata();
    
    $output .= '</div>';
    
    return $output;
}
add_shortcode('fishing_spots', 'fishing_spots_shortcode');

// Front-end submission form shortcode
function fishing_spot_submission_form_shortcode() {
    // Only show form to logged in users
    if (!is_user_logged_in()) {
        return '<p>Please <a href="' . wp_login_url(get_permalink()) . '">login</a> to submit a fishing spot.</p>';
    }
    
    $output = '<form id="fishing-spot-submission-form" method="post" enctype="multipart/form-data">';
    $output .= wp_nonce_field('fishing_spot_submission', 'fishing_spot_submission_nonce', true, false);
    
    $output .= '<div class="form-group">';
    $output .= '<label for="spot_name">Spot Name:</label>';
    $output .= '<input type="text" id="spot_name" name="spot_name" required />';
    $output .= '</div>';
    
    $output .= '<div class="form-group">';
    $output .= '<label for="spot_province">Province:</label>';
    $output .= '<select id="spot_province" name="spot_province" required>
        <option value="">Select Province</option>
        <option value="Alberta">Alberta</option>
        <option value="British Columbia">British Columbia</option>
        <option value="Manitoba">Manitoba</option>
        <option value="New Brunswick">New Brunswick</option>
        <option value="Newfoundland and Labrador">Newfoundland and Labrador</option>
        <option value="Northwest Territories">Northwest Territories</option>
        <option value="Nova Scotia">Nova Scotia</option>
        <option value="Nunavut">Nunavut</option>
        <option value="Ontario">Ontario</option>
        <option value="Prince Edward Island">Prince Edward Island</option>
        <option value="Quebec">Quebec</option>
        <option value="Saskatchewan">Saskatchewan</option>
        <option value="Yukon">Yukon</option>
    </select>';
    $output .= '</div>';
    
    // Additional form fields would go here
    
    $output .= '<div class="form-group">';
    $output .= '<input type="submit" name="submit_fishing_spot" value="Submit Fishing Spot" />';
    $output .= '</div>';
    
    $output .= '</form>';
    
    return $output;
}
add_shortcode('fishing_spot_submission_form', 'fishing_spot_submission_form_shortcode');

// Process submission form
function process_fishing_spot_submission() {
    if (isset($_POST['submit_fishing_spot']) && isset($_POST['fishing_spot_submission_nonce'])) {
        if (!wp_verify_nonce($_POST['fishing_spot_submission_nonce'], 'fishing_spot_submission')) {
            wp_die('Security check failed');
        }
        
        if (!is_user_logged_in()) {
            wp_die('You must be logged in to submit a fishing spot');
        }
        
        // Create post
        $post_data = array(
            'post_title' => sanitize_text_field($_POST['spot_name']),
            'post_content' => '',
            'post_status' => 'pending', // Set to pending for moderation
            'post_type' => 'fishing_spot',
            'post_author' => get_current_user_id()
        );
        
        $post_id = wp_insert_post($post_data);
        
        if (!is_wp_error($post_id)) {
            // Save meta data
            update_post_meta($post_id, '_province', sanitize_text_field($_POST['spot_province']));
            
            // Save other meta data
            
            // Redirect to thank you page
            wp_redirect(home_url('/thank-you-for-submission/'));
            exit;
        }
    }
}
add_action('template_redirect', 'process_fishing_spot_submission');

// Add settings page
function fishing_spots_settings_menu() {
    add_options_page(
        'Fishing Spots Settings',
        'Fishing Spots',
        'manage_options',
        'fishing-spots-settings',
        'fishing_spots_settings_page'
    );
}
add_action('admin_menu', 'fishing_spots_settings_menu');

function fishing_spots_settings_page() {
    ?>
    <div class="wrap">
        <h1>Fishing Spots Settings</h1>
        <form method="post" action="options.php">
            <?php
            settings_fields('fishing_spots_options');
            do_settings_sections('fishing-spots-settings');
            submit_button();
            ?>
        </form>
    </div>
    <?php
}

// Add stylesheet
function fishing_spots_styles() {
    wp_enqueue_style('fishing-spots-style', plugins_url('css/fishing-spots.css', __FILE__));
    wp_enqueue_script('fishing-spots-script', plugins_url('js/fishing-spots.js', __FILE__), array('jquery'), '1.0', true);
    
    // Localize script for AJAX
    wp_localize_script('fishing-spots-script', 'fishing_spots_ajax', array(
        'ajax_url' => admin_url('admin-ajax.php'),
        'nonce' => wp_create_nonce('fishing_spots_ajax_nonce')
    ));
}
add_action('wp_enqueue_scripts', 'fishing_spots_styles');

// AJAX search function
function fishing_spots_ajax_search() {
    check_ajax_referer('fishing_spots_ajax_nonce', 'nonce');
    
    $args = array(
        'post_type' => 'fishing_spot',
        'posts_per_page' => 10,
        's' => sanitize_text_field($_POST['search_term'])
    );
    
    $query = new WP_Query($args);
    $results = array();
    
    if ($query->have_posts()) {
        while ($query->have_posts()) {
            $query->the_post();
            $id = get_the_ID();
            
            $results[] = array(
                'id' => $id,
                'title' => get_the_title(),
                'permalink' => get_permalink(),
                'province' => get_post_meta($id, '_province', true),
                'thumbnail' => has_post_thumbnail() ? get_the_post_thumbnail_url($id, 'thumbnail') : '',
            );
        }
    }
    
    wp_reset_postdata();
    wp_send_json_success($results);
}
add_action('wp_ajax_fishing_spots_search', 'fishing_spots_ajax_search');
add_action('wp_ajax_nopriv_fishing_spots_search', 'fishing_spots_ajax_search');

