<?php
/**
 * PufferGo Archive Data — 产品列表页数据聚合层。
 *
 * 将 WordPress 查询、分类、分页等数据一次性收集，
 * 模板只消费 $data 对象，不直接调用 WordPress API。
 *
 * @package PufferGo
 */

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

class PufferGo_Archive_Data {

	// ── 页面上下文 ──

	/** @var string 页面标题 */
	public $page_title;

	/** @var string 页面描述（分类描述等） */
	public $page_description = '';

	/** @var bool 是否为分类页 */
	public $is_category_page = false;

	/** @var int 当前分类 ID（非分类页为 0） */
	public $active_category_id = 0;

	/** @var string 产品归档页 URL */
	public $archive_url;

	// ── 分类筛选 ──

	/** @var array 分类列表 [{id, name, url}] */
	public $categories = array();

	// ── 产品列表 ──

	/**
	 * 产品卡片列表。
	 *
	 * @var array 每个元素包含：
	 *   - id          (int)    产品 ID
	 *   - title       (string) 产品标题
	 *   - url         (string) 产品详情页链接
	 *   - image_id    (int)    卡片图片附件 ID（用于 wp_get_attachment_image 等渲染）
	 *   - is_video    (bool)   是否为视频
	 *   - price       (string) 格式化后的价格展示文本
	 *   - description (string) 简短描述（优先 short_description，其次 excerpt 摘要）
	 */
	public $products = array();

	// ── 分页 ──

	/** @var string 分页 HTML（已渲染） */
	public $pagination_html = '';

	/**
	 * 从当前 WordPress 查询构建数据对象。
	 *
	 * @return self
	 */
	public static function from_current_query() {
		return new self();
	}

	/**
	 * 构造函数：收集全部归档页数据。
	 */
	public function __construct() {
		$this->load_page_context();
		$this->load_categories();
		$this->load_products();
		$this->load_pagination();
	}

	/**
	 * 加载页面上下文（标题、描述、分类判定）。
	 */
	private function load_page_context() {
		$this->is_category_page   = is_tax( 'puffergo_product_cat' );
		$this->page_title         = $this->is_category_page
			? single_term_title( '', false )
			: __( 'Products', 'puffergo' );
		$this->page_description   = $this->is_category_page ? term_description() : '';
		$this->active_category_id = $this->is_category_page ? get_queried_object_id() : 0;
		$this->archive_url        = get_post_type_archive_link( 'puffergo_product' );
	}

	/**
	 * 加载分类列表（用于筛选导航）。
	 */
	private function load_categories() {
		$terms = get_terms( array(
			'taxonomy'   => 'puffergo_product_cat',
			'hide_empty' => true,
		) );

		if ( is_wp_error( $terms ) || empty( $terms ) ) {
			return;
		}

		foreach ( $terms as $term ) {
			$this->categories[] = array(
				'id'   => $term->term_id,
				'name' => $term->name,
				'url'  => get_term_link( $term ),
			);
		}
	}

	/**
	 * 遍历 WP Loop，收集所有产品卡片数据。
	 */
	private function load_products() {
		$use_formatter = class_exists( 'PufferGo_Unit_Formatter' );

		if ( ! have_posts() ) {
			return;
		}

		while ( have_posts() ) {
			the_post();
			$this->products[] = self::build_product_card( get_the_ID(), $use_formatter );
		}
	}

	/**
	 * 构建单个产品卡片数据。
	 *
	 * @param int  $product_id    产品 ID。
	 * @param bool $use_formatter 是否有 Unit_Formatter。
	 * @return array
	 */
	private static function build_product_card( $product_id, $use_formatter ) {
		$card = PufferGo_Product_CPT::get_card_data( $product_id, $use_formatter );

		$short_description = $card['short_description'];

		return array(
			'id'          => $product_id,
			'title'       => get_the_title( $product_id ),
			'url'         => get_permalink( $product_id ),
			'image_id'    => (int) $card['display_id'],
			'is_video'    => $card['is_video'],
			'price'       => $card['price_display'],
			'description' => $short_description ?: wp_trim_words( get_the_excerpt( $product_id ), 15 ),
		);
	}

	/**
	 * 生成分页 HTML。
	 */
	private function load_pagination() {
		if ( ! get_the_posts_pagination() ) {
			return;
		}

		$this->pagination_html = paginate_links( array(
			'prev_text' => '<span class="px-3 py-2 border rounded-l">' . esc_html__( 'Prev', 'puffergo' ) . '</span>',
			'next_text' => '<span class="px-3 py-2 border rounded-r">' . esc_html__( 'Next', 'puffergo' ) . '</span>',
		) );
	}

	/**
	 * 获取面包屑数据。
	 *
	 * @return array 每个元素 ['url' => string|null, 'label' => string]
	 */
	public function get_breadcrumb_items() {
		$items = array();

		$items[] = array(
			'url'   => $this->archive_url,
			'label' => __( 'Products', 'puffergo' ),
		);

		if ( $this->is_category_page ) {
			$items[] = array(
				'url'   => null,
				'label' => $this->page_title,
			);
		}

		return $items;
	}
}
