<?php
/**
 * PufferGo Blog Single Data — 博客详情页数据聚合层。
 *
 * 将单篇文章的全部数据一次性收集，
 * 模板只消费 $data 对象，不直接调用 WordPress API。
 *
 * @package PufferGo
 */

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

class PufferGo_Blog_Single_Data {

	// ── 文章基本信息 ──

	/** @var int 文章 ID */
	public $id;

	/** @var string 文章标题 */
	public $title;

	/** @var string 文章内容（已过滤） */
	public $content;

	/** @var string 作者显示名 */
	public $author;

	/** @var string 格式化日期 */
	public $date;

	// ── 分类 ──

	/** @var array 文章分类列表 */
	public $categories = array();

	/** @var WP_Term|null 主分类 */
	public $primary_category = null;

	/** @var string 主分类名 */
	public $category_name = '';

	// ── 特色图 ──

	/** @var string 特色图 URL */
	public $hero_image_url = '';

	/** @var string 特色图 alt */
	public $hero_image_alt = '';

	// ── 相邻文章 ──

	/**
	 * 上一篇文章。
	 *
	 * @var array|null 包含 id, title, url, category_name；null 表示无上一篇。
	 */
	public $prev_post = null;

	/**
	 * 下一篇文章。
	 *
	 * @var array|null 包含 id, title, url, category_name；null 表示无下一篇。
	 */
	public $next_post = null;

	// ── 相关文章 ──

	/**
	 * 相关文章列表。
	 *
	 * @var array 每个元素包含 id, title, url, image_url, category_name
	 */
	public $related_posts = array();

	// ── 评论 ──

	/** @var bool 评论是否开放 */
	public $comments_open = false;

	/** @var int 评论数量 */
	public $comment_count = 0;

	/** @var array 评论列表（WP_Comment[]） */
	public $comments = array();

	// ── 导航 ──

	/** @var string 博客归档页链接 */
	public $breadcrumb_link;

	/** @var string 面包屑文本 */
	public $breadcrumb_text;

	/**
	 * 从当前文章创建数据对象。
	 *
	 * @return self
	 */
	public static function from_current_post() {
		return new self( get_the_ID() );
	}

	/**
	 * 构造函数：收集全部文章数据。
	 *
	 * @param int $post_id 文章 ID。
	 */
	public function __construct( $post_id ) {
		$this->id = $post_id;
		$this->load_post_data();
		$this->load_categories();
		$this->load_adjacent_posts();
		$this->load_related_posts();
		$this->load_comments();
		$this->resolve_breadcrumb();
	}

	/**
	 * 加载文章基本信息。
	 */
	private function load_post_data() {
		$this->title   = get_the_title( $this->id );
		$this->author  = get_the_author_meta( 'display_name', get_post_field( 'post_author', $this->id ) );
		$this->date    = get_the_date( get_option( 'date_format' ), $this->id );

		// 文章内容：排除旧 Gutenberg 区块（export-toolkit/blog-detail-page），
		// 避免在模板渲染时触发区块自身的 render_callback 导致递归。
		$raw_content   = get_post_field( 'post_content', $this->id );
		$block_name    = 'export-toolkit/blog-detail-page';
		if ( strpos( $raw_content, '<!-- wp:' . $block_name ) !== false ) {
			$raw_content = preg_replace(
				'/<!-- wp:' . preg_quote( $block_name, '/' ) . '.*?\/wp:' . preg_quote( $block_name, '/' ) . ' -->/s',
				'',
				$raw_content
			);
		}
		$this->content = apply_filters( 'the_content', $raw_content );

		// 特色图
		$thumbnail_id      = get_post_thumbnail_id( $this->id );
		$this->hero_image_url = $thumbnail_id ? get_the_post_thumbnail_url( $this->id, 'large' ) : '';
		$this->hero_image_alt = $thumbnail_id ? get_post_meta( $thumbnail_id, '_wp_attachment_image_alt', true ) : '';
		if ( empty( $this->hero_image_alt ) ) {
			$this->hero_image_alt = $this->title;
		}
	}

	/**
	 * 加载分类信息。
	 */
	private function load_categories() {
		$this->categories       = get_the_category( $this->id );
		$this->primary_category = ! empty( $this->categories ) ? $this->categories[0] : null;
		$this->category_name    = $this->primary_category ? $this->primary_category->name : '';
	}

	/**
	 * 加载上一篇/下一篇文章。
	 */
	private function load_adjacent_posts() {
		$prev = get_previous_post();
		if ( ! empty( $prev ) ) {
			$cats               = get_the_category( $prev->ID );
			$this->prev_post    = array(
				'id'            => $prev->ID,
				'title'         => get_the_title( $prev->ID ),
				'url'           => get_permalink( $prev->ID ),
				'category_name' => ! empty( $cats ) ? $cats[0]->name : '',
			);
		}

		$next = get_next_post();
		if ( ! empty( $next ) ) {
			$cats               = get_the_category( $next->ID );
			$this->next_post    = array(
				'id'            => $next->ID,
				'title'         => get_the_title( $next->ID ),
				'url'           => get_permalink( $next->ID ),
				'category_name' => ! empty( $cats ) ? $cats[0]->name : '',
			);
		}
	}

	/**
	 * 加载同分类相关文章（最多 3 篇）。
	 */
	private function load_related_posts() {
		if ( ! $this->primary_category ) {
			return;
		}

		$query = new WP_Query( array(
			'post_type'      => 'post',
			'post_status'    => 'publish',
			'posts_per_page' => 3,
			'post__not_in'   => array( $this->id ),
			'category__in'   => array( $this->primary_category->term_id ),
			'orderby'        => 'date',
			'order'          => 'DESC',
		) );

		while ( $query->have_posts() ) {
			$query->the_post();
			$cats = get_the_category();
			$this->related_posts[] = array(
				'id'            => get_the_ID(),
				'title'         => get_the_title(),
				'url'           => get_permalink(),
				'image_url'     => get_the_post_thumbnail_url( get_the_ID(), 'medium' ) ?: '',
				'category_name' => ! empty( $cats ) ? $cats[0]->name : '',
			);
		}
		wp_reset_postdata();
	}

	/**
	 * 加载评论状态。收集评论数据供模板层使用。
	 * 全局 $wp_query 的评论注入由 layout 层负责，遵循 Data/UI 分离原则。
	 */
	private function load_comments() {
		$this->comments_open = comments_open( $this->id );
		$this->comment_count = get_comments_number( $this->id );
		$this->comments      = get_comments( array(
			'post_id' => $this->id,
			'status'  => 'approve',
			'order'   => 'ASC',
		) );
	}

	/**
	 * 解析面包屑链接。
	 */
	private function resolve_breadcrumb() {
		$this->breadcrumb_text = __( 'Blog', 'puffergo' );
		$this->breadcrumb_link = get_post_type_archive_link( 'post' );

		if ( empty( $this->breadcrumb_link ) ) {
			// 查找博客页面
			$pages = get_posts( array(
				'post_type'      => 'page',
				'post_status'    => 'publish',
				'posts_per_page' => -1,
			) );
			foreach ( $pages as $page ) {
				if ( has_block( 'export-toolkit/blog-archive', $page->ID ) ) {
					$this->breadcrumb_link = get_permalink( $page->ID );
					break;
				}
			}
		}

		if ( empty( $this->breadcrumb_link ) ) {
			$this->breadcrumb_link = home_url( '/blog' );
		}
	}

	/**
	 * 获取面包屑数据。
	 *
	 * @return array
	 */
	public function get_breadcrumb_items() {
		$items   = array();
		$items[] = array(
			'url'   => $this->breadcrumb_link,
			'label' => $this->breadcrumb_text,
		);

		if ( $this->primary_category ) {
			$items[] = array(
				'url'   => get_category_link( $this->primary_category->term_id ),
				'label' => $this->category_name,
			);
		}

		$items[] = array(
			'url'   => null,
			'label' => $this->title,
		);

		return $items;
	}
}
