<?php
/**
 * 自定义分类元框和筛选功能
 * 在默认文章编辑页面添加分类元框，支持添加分类和子分类
 */

// 防止直接访问
if (!defined('ABSPATH')) {
    exit;
}

class CustomCategoryMetaBox {
    
    public function __construct() {
        // 添加元框到默认文章编辑页面
        add_action('add_meta_boxes', array($this, 'add_custom_category_meta_box'));
        add_action('add_meta_boxes', array($this, 'add_article_info_meta_box'));
        
        // 保存文章时保存自定义分类
        add_action('save_post', array($this, 'save_custom_categories'));
        add_action('save_post', array($this, 'save_article_info'));
        
        // 在文章列表页面添加筛选区域
        add_action('restrict_manage_posts', array($this, 'add_category_filter'));
        
        // 处理筛选查询
        add_filter('parse_query', array($this, 'handle_category_filter_query'));
        
        // 在文章内容前显示文章信息
        add_action('the_content', array($this, 'display_article_info'));
        
        // 在文章编辑页面添加JavaScript
        add_action('admin_footer-post.php', array($this, 'add_custom_js'));
        add_action('admin_footer-post-new.php', array($this, 'add_custom_js'));
        
        // 添加AJAX处理函数
        add_action('wp_ajax_get_sub_categories', array($this, 'get_sub_categories_ajax'));
        add_action('wp_ajax_create_sub_category', array($this, 'create_sub_category_ajax'));
    }
    
    /**
     * 添加自定义分类元框
     */
    public function add_custom_category_meta_box() {
        add_meta_box(
            'custom-category-meta-box',
            '自定义分类和子分类',
            array($this, 'render_custom_category_meta_box'),
            'post', // 默认文章类型
            'normal',
            'default'
        );
    }
    
    /**
     * 添加文章基本信息元框
     */
    public function add_article_info_meta_box() {
        add_meta_box(
            'article-info-meta-box',
            '文章基本信息',
            array($this, 'render_article_info_meta_box'),
            'post', // 默认文章类型
            'normal',
            'default'
        );
    }
    
    /**
     * 渲染文章基本信息元框
     */
    public function render_article_info_meta_box($post) {
        // 获取已保存的文章信息
        $source_url = get_post_meta($post->ID, '_article_source_url', true);
        $original_author = get_post_meta($post->ID, '_article_original_author', true);
        
        wp_nonce_field('article_info_meta_box', 'article_info_meta_box_nonce');
        ?>
        <style>
        .article-info-field {
            margin-bottom: 15px;
        }
        .article-info-field label {
            display: block;
            margin-bottom: 5px;
            font-weight: bold;
        }
        .article-info-field input[type="text"],
        .article-info-field input[type="url"] {
            width: 100%;
            padding: 8px;
        }
        </style>
        
        <div class="article-info-field">
            <label for="article_source_url">文章来源链接:</label>
            <input type="url" id="article_source_url" name="article_source_url" value="<?php echo esc_url($source_url); ?>" placeholder="https://example.com/article">
        </div>
        
        <div class="article-info-field">
            <label for="article_original_author">原作者:</label>
            <input type="text" id="article_original_author" name="article_original_author" value="<?php echo esc_attr($original_author); ?>" placeholder="作者姓名">
        </div>
        
        <p class="description">这些信息将在文章页面显示</p>
        <?php
    }
    
    /**
     * 渲染自定义分类元框
     */
    public function render_custom_category_meta_box($post) {
        // 获取已保存的主分类和子分类
        $selected_main_category = get_post_meta($post->ID, '_custom_main_category', true);
        $selected_sub_categories = get_post_meta($post->ID, '_custom_sub_categories', true);
        if (!is_array($selected_sub_categories)) {
            $selected_sub_categories = array();
        }
        
        // 获取所有主分类
        $main_categories = get_categories(array(
            'taxonomy' => 'category',
            'parent' => 0,
            'hide_empty' => false
        ));
        
        wp_nonce_field('custom_category_meta_box', 'custom_category_meta_box_nonce');
        ?>
        <style>
        .custom-category-selector {
            margin-bottom: 15px;
        }
        .custom-category-selector label {
            display: block;
            margin-bottom: 5px;
            font-weight: bold;
        }
        .custom-category-selector select {
            width: 100%;
            margin-bottom: 10px;
        }
        .sub-category-list {
            max-height: 200px;
            overflow-y: auto;
            border: 1px solid #ddd;
            padding: 10px;
            margin-bottom: 10px;
        }
        .sub-category-item {
            margin-bottom: 5px;
        }
        .sub-category-item input {
            margin-right: 5px;
        }
        .create-sub-category {
            margin-top: 10px;
            padding-top: 10px;
            border-top: 1px solid #ddd;
        }
        .create-sub-category input[type="text"] {
            width: 70%;
            margin-right: 5px;
        }
        .create-sub-category button {
            width: 25%;
        }
        .create-sub-category-message {
            margin-top: 5px;
            font-size: 12px;
            color: green;
        }
        .create-sub-category-error {
            color: red;
        }
        </style>
        
        <div class="custom-category-selector">
            <label for="custom_main_category">选择主分类:</label>
            <select name="custom_main_category" id="custom_main_category">
                <option value="">请选择主分类</option>
                <?php foreach ($main_categories as $category): ?>
                    <option value="<?php echo esc_attr($category->term_id); ?>" <?php selected($selected_main_category, $category->term_id); ?>>
                        <?php echo esc_html($category->name); ?>
                    </option>
                <?php endforeach; ?>
            </select>
        </div>
        
        <div class="custom-category-selector">
            <label for="custom_sub_categories">选择子分类:</label>
            <div class="sub-category-list" id="sub_category_list">
                <?php if ($selected_main_category): ?>
                    <?php $this->render_sub_categories($selected_main_category, $selected_sub_categories); ?>
                <?php else: ?>
                    <p>请先选择一个主分类以显示其子分类</p>
                <?php endif; ?>
            </div>
            
            <div class="create-sub-category" id="create_sub_category_container" style="display: <?php echo $selected_main_category ? 'block' : 'none'; ?>;">
                <input type="text" id="new_sub_category_name" placeholder="输入新子分类名称">
                <button type="button" id="create_sub_category_btn">创建子分类</button>
                <div class="create-sub-category-message" id="create_sub_category_message"></div>
            </div>
        </div>
        
        <p class="description">选择的分类将自动添加到文章的默认分类中</p>
        <?php
    }
    
    /**
     * 渲染子分类列表
     */
    public function render_sub_categories($parent_id, $selected = array()) {
        $sub_categories = get_categories(array(
            'taxonomy' => 'category',
            'parent' => $parent_id,
            'hide_empty' => false
        ));
        
        if (empty($sub_categories)) {
            echo '<p>该主分类下没有子分类</p>';
            return;
        }
        
        foreach ($sub_categories as $category) {
            echo '<div class="sub-category-item">';
            echo '<label>';
            echo '<input type="checkbox" name="custom_sub_categories[]" value="' . esc_attr($category->term_id) . '" ' . checked(in_array($category->term_id, $selected), true, false) . '> ';
            echo esc_html($category->name);
            echo '</label>';
            echo '</div>';
        }
    }
    
    /**
     * AJAX获取子分类
     */
    public function get_sub_categories_ajax() {
        // 检查权限
        if (!current_user_can('edit_posts')) {
            wp_die('权限不足');
        }
        
        $parent_id = isset($_POST['parent_id']) ? intval($_POST['parent_id']) : 0;
        
        if ($parent_id <= 0) {
            wp_die('无效的主分类ID');
        }
        
        // 获取已选择的子分类（如果有post_id参数）
        $post_id = isset($_POST['post_id']) ? intval($_POST['post_id']) : 0;
        $selected_sub_categories = array();
        if ($post_id > 0) {
            $selected_sub_categories = get_post_meta($post_id, '_custom_sub_categories', true);
            if (!is_array($selected_sub_categories)) {
                $selected_sub_categories = array();
            }
        }
        
        ob_start();
        $this->render_sub_categories($parent_id, $selected_sub_categories);
        $output = ob_get_clean();
        
        wp_send_json_success($output);
    }
    
    /**
     * AJAX创建子分类
     */
    public function create_sub_category_ajax() {
        // 检查权限
        if (!current_user_can('manage_categories')) {
            wp_send_json_error('权限不足');
        }
        
        // 验证nonce
        if (!wp_verify_nonce($_POST['nonce'], 'custom_category_meta_box')) {
            wp_send_json_error('安全验证失败');
        }
        
        $parent_id = isset($_POST['parent_id']) ? intval($_POST['parent_id']) : 0;
        $sub_category_name = isset($_POST['sub_category_name']) ? sanitize_text_field($_POST['sub_category_name']) : '';
        
        if ($parent_id <= 0) {
            wp_send_json_error('无效的主分类ID');
        }
        
        if (empty($sub_category_name)) {
            wp_send_json_error('子分类名称不能为空');
        }
        
        // 检查子分类是否已存在
        $existing_category = get_term_by('name', $sub_category_name, 'category', 'ARRAY_A');
        if ($existing_category && $existing_category['parent'] == $parent_id) {
            wp_send_json_error('该子分类已存在');
        }
        
        // 创建子分类
        $result = wp_insert_term($sub_category_name, 'category', array(
            'parent' => $parent_id
        ));
        
        if (is_wp_error($result)) {
            wp_send_json_error('创建子分类失败: ' . $result->get_error_message());
        }
        
        // 返回新创建的子分类信息
        $new_category = get_term($result['term_id'], 'category');
        
        wp_send_json_success(array(
            'term_id' => $new_category->term_id,
            'name' => $new_category->name,
            'message' => '子分类创建成功'
        ));
    }
    
    /**
     * 保存自定义分类
     */
    public function save_custom_categories($post_id) {
        // 检查权限
        if (!isset($_POST['custom_category_meta_box_nonce']) || !wp_verify_nonce($_POST['custom_category_meta_box_nonce'], 'custom_category_meta_box')) {
            return;
        }
        
        // 自动保存时跳过
        if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
            return;
        }
        
        // 检查权限
        if (!current_user_can('edit_post', $post_id)) {
            return;
        }
        
        // 保存主分类
        if (isset($_POST['custom_main_category'])) {
            $main_category = intval($_POST['custom_main_category']);
            update_post_meta($post_id, '_custom_main_category', $main_category);
        }
        
        // 保存子分类
        $sub_categories = isset($_POST['custom_sub_categories']) ? array_map('intval', $_POST['custom_sub_categories']) : array();
        update_post_meta($post_id, '_custom_sub_categories', $sub_categories);
        
        // 将自定义分类添加到文章的默认分类中
        $categories = wp_get_post_categories($post_id);
        
        // 添加主分类
        if (!empty($_POST['custom_main_category'])) {
            $main_category = intval($_POST['custom_main_category']);
            if (!in_array($main_category, $categories)) {
                $categories[] = $main_category;
            }
        }
        
        // 添加子分类
        foreach ($sub_categories as $sub_category) {
            if (!in_array($sub_category, $categories)) {
                $categories[] = $sub_category;
            }
        }
        
        // 更新文章分类
        wp_set_post_categories($post_id, $categories);
    }
    
    /**
     * 保存文章基本信息
     */
    public function save_article_info($post_id) {
        // 检查权限
        if (!isset($_POST['article_info_meta_box_nonce']) || !wp_verify_nonce($_POST['article_info_meta_box_nonce'], 'article_info_meta_box')) {
            return;
        }
        
        // 自动保存时跳过
        if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
            return;
        }
        
        // 检查权限
        if (!current_user_can('edit_post', $post_id)) {
            return;
        }
        
        // 保存文章来源链接
        if (isset($_POST['article_source_url'])) {
            $source_url = esc_url_raw($_POST['article_source_url']);
            update_post_meta($post_id, '_article_source_url', $source_url);
        }
        
        // 保存原作者
        if (isset($_POST['article_original_author'])) {
            $original_author = sanitize_text_field($_POST['article_original_author']);
            update_post_meta($post_id, '_article_original_author', $original_author);
        }
    }
    
    /**
     * 在文章内容前显示文章信息
     */
    public function display_article_info($content) {
        // 仅在单篇文章页面显示
        if (!is_single() || get_post_type() !== 'post') {
            return $content;
        }
        
        global $post;
        
        // 获取文章信息
        $source_url = get_post_meta($post->ID, '_article_source_url', true);
        $original_author = get_post_meta($post->ID, '_article_original_author', true);
        
        // 如果没有信息要显示，则返回原始内容
        if (empty($source_url) && empty($original_author)) {
            return $content;
        }
        
        // 构建文章信息HTML
        $info_html = '<div class="article-source-info" style="margin: 20px 0; padding: 15px; background-color: #f9f9f9; border-left: 4px solid #0073aa;">';
        $info_html .= '<h4>文章信息</h4>';
        
        if (!empty($original_author)) {
            $info_html .= '<p><strong>原作者:</strong> ' . esc_html($original_author) . '</p>';
        }
        
        if (!empty($source_url)) {
            $info_html .= '<p><strong>来源:</strong> <a href="' . esc_url($source_url) . '" target="_blank" rel="noopener">查看原文</a></p>';
        }
        
        $info_html .= '</div>';
        
        // 将文章信息添加到内容前
        return $info_html . $content;
    }
    
    /**
     * 在文章列表页面添加分类筛选
     */
    public function add_category_filter() {
        global $typenow;
        
        if ($typenow != 'post') {
            return;
        }
        
        // 获取所有主分类
        $main_categories = get_categories(array(
            'taxonomy' => 'category',
            'parent' => 0,
            'hide_empty' => false
        ));
        
        // 获取当前选择的主分类
        $selected_main = isset($_GET['custom_main_category']) ? intval($_GET['custom_main_category']) : 0;
        
        echo '<select name="custom_main_category" id="custom_main_category_filter">';
        echo '<option value="">所有主分类</option>';
        foreach ($main_categories as $category) {
            echo '<option value="' . esc_attr($category->term_id) . '" ' . selected($selected_main, $category->term_id, false) . '>' . esc_html($category->name) . '</option>';
        }
        echo '</select>';
        
        // 如果选择了主分类，显示子分类筛选
        if ($selected_main) {
            $sub_categories = get_categories(array(
                'taxonomy' => 'category',
                'parent' => $selected_main,
                'hide_empty' => false
            ));
            
            if (!empty($sub_categories)) {
                $selected_sub = isset($_GET['custom_sub_category']) ? intval($_GET['custom_sub_category']) : 0;
                
                echo '<select name="custom_sub_category" id="custom_sub_category_filter">';
                echo '<option value="">所有子分类</option>';
                foreach ($sub_categories as $category) {
                    echo '<option value="' . esc_attr($category->term_id) . '" ' . selected($selected_sub, $category->term_id, false) . '>' . esc_html($category->name) . '</option>';
                }
                echo '</select>';
            }
        }
    }
    
    /**
     * 处理分类筛选查询
     */
    public function handle_category_filter_query($query) {
        global $pagenow;
        
        if (
            is_admin() && 
            $pagenow == 'edit.php' && 
            isset($_GET['post_type']) && 
            $_GET['post_type'] == 'post' &&
            (isset($_GET['custom_main_category']) || isset($_GET['custom_sub_category']))
        ) {
            $qv = &$query->query_vars;
            
            // 初始化分类查询
            if (!isset($qv['tax_query'])) {
                $qv['tax_query'] = array();
            }
            
            // 添加主分类筛选
            if (!empty($_GET['custom_main_category'])) {
                $qv['tax_query'][] = array(
                    'taxonomy' => 'category',
                    'field'    => 'term_id',
                    'terms'    => intval($_GET['custom_main_category']),
                );
            }
            
            // 添加子分类筛选
            if (!empty($_GET['custom_sub_category'])) {
                $qv['tax_query'][] = array(
                    'taxonomy' => 'category',
                    'field'    => 'term_id',
                    'terms'    => intval($_GET['custom_sub_category']),
                );
            }
        }
    }
    
    /**
     * 添加JavaScript处理动态交互
     */
    public function add_custom_js() {
        global $post, $post_type;
        
        if ($post_type != 'post') {
            return;
        }
        
        $post_id = isset($post->ID) ? $post->ID : 0;
        ?>
        <script>
        jQuery(document).ready(function($) {
            // 主分类改变时更新子分类列表
            $('#custom_main_category').on('change', function() {
                var parentId = $(this).val();
                var postId = <?php echo intval($post_id); ?>;
                
                if (parentId === '') {
                    $('#sub_category_list').html('<p>请先选择一个主分类以显示其子分类</p>');
                    return;
                }
                
                // 显示加载状态
                $('#sub_category_list').html('<p>加载中...</p>');
                
                // AJAX获取子分类
                $.post(ajaxurl, {
                    action: 'get_sub_categories',
                    parent_id: parentId,
                    post_id: postId
                }, function(response) {
                    if (response.success) {
                        $('#sub_category_list').html(response.data);
                    } else {
                        $('#sub_category_list').html('<p>加载失败: ' + response.data + '</p>');
                    }
                }).fail(function() {
                    $('#sub_category_list').html('<p>加载失败</p>');
                });
            });
            
            // 创建子分类
            $('#create_sub_category_btn').on('click', function() {
                var parentId = $('#custom_main_category').val();
                var subCategoryName = $('#new_sub_category_name').val();
                
                if (parentId === '') {
                    $('#create_sub_category_message').text('请先选择一个主分类').addClass('create-sub-category-error');
                    return;
                }
                
                if (subCategoryName.trim() === '') {
                    $('#create_sub_category_message').text('请输入子分类名称').addClass('create-sub-category-error');
                    return;
                }
                
                // 清除之前的消息
                $('#create_sub_category_message').removeClass('create-sub-category-error').text('创建中...');
                
                // AJAX创建子分类
                $.post(ajaxurl, {
                    action: 'create_sub_category',
                    parent_id: parentId,
                    sub_category_name: subCategoryName,
                    nonce: '<?php echo wp_create_nonce("custom_category_meta_box"); ?>'
                }, function(response) {
                    if (response.success) {
                        // 显示成功消息
                        $('#create_sub_category_message').removeClass('create-sub-category-error').text(response.data.message);
                        
                        // 清空输入框
                        $('#new_sub_category_name').val('');
                        
                        // 重新加载子分类列表
                        $('#custom_main_category').trigger('change');
                        
                        // 3秒后清除消息
                        setTimeout(function() {
                            $('#create_sub_category_message').text('');
                        }, 3000);
                    } else {
                        $('#create_sub_category_message').addClass('create-sub-category-error').text(response.data);
                    }
                }).fail(function() {
                    $('#create_sub_category_message').addClass('create-sub-category-error').text('创建失败');
                });
            });
            
            // 文章列表页面筛选交互
            $('#custom_main_category_filter').on('change', function() {
                // 重新加载页面以显示子分类筛选
                var baseUrl = window.location.href.split('?')[0];
                var mainCat = $(this).val();
                
                if (mainCat === '') {
                    window.location.href = baseUrl + '?post_type=post';
                } else {
                    window.location.href = baseUrl + '?post_type=post&custom_main_category=' + mainCat;
                }
            });
        });
        </script>
        <?php
    }
}

// 初始化类
new CustomCategoryMetaBox();