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

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

class PufferGo_Blog_Archive_Data {

	// ── 页面上下文 ──

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

	/** @var string 页面描述 */
	public $page_description = '';

	/** @var string 页面副标题 */
	public $page_subtitle = '';

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

	/** @var int 当前分类 ID */
	public $active_category_id = 0;

	/** @var WP_Term|null 当前分类对象 */
	public $current_category = null;

	/** @var string 当前页面 URL（用于构建筛选链接） */
	public $current_url;

	/** @var string 博客归档页 URL */
	public $archive_url;

	// ── Hero 区域 ──

	/** @var string Hero 背景图 URL（PC） */
	public $hero_bg_image = '';

	/** @var string Hero 背景图 URL（移动端） */
	public $hero_bg_image_mobile = '';

	// ── 分类筛选 ──

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

	// ── 搜索与筛选 ──

	/** @var string 搜索关键词 */
	public $search_query = '';

	/** @var string 分类 slug 筛选 */
	public $category_slug = '';

	/** @var int 当前页码 */
	public $paged = 1;

	// ── 文章列表 ──

	/**
	 * 文章卡片数据列表。
	 *
	 * @var array 每个元素包含：
	 *   - id              (int)    文章 ID
	 *   - title           (string) 文章标题
	 *   - url             (string) 文章链接
	 *   - image_url       (string) 图片 URL（空字符串表示无图）
	 *   - image_alt       (string) 图片 alt 文本
	 *   - excerpt         (string) 摘要
	 *   - author          (string) 作者名
	 *   - date            (string) 格式化日期
	 *   - category_name   (string) 主分类名
	 *   - category_slug   (string) 主分类 slug
	 *   - category_style  (array)  分类颜色 ['color' => '', 'bgColor' => '']
	 */
	public $posts = array();

	// ── 分页 ──

	/** @var int 最大页数 */
	public $max_pages = 0;

	/** @var int 文章总数 */
	public $found_posts = 0;

	/** @var string 分页基础 URL（含搜索词） */
	public $pagination_base_url = '';

	/** @var int 每页文章数 */
	public $posts_per_page = 9;

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

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

	/**
	 * 加载页面上下文。
	 */
	private function load_page_context() {
		$this->is_category_page = is_category();

		if ( $this->is_category_page ) {
			$this->current_category  = get_queried_object();
			$this->category_slug     = $this->current_category->slug ?? '';
			$this->active_category_id = $this->current_category->term_id ?? 0;
			$this->page_title        = single_term_title( '', false );
			$this->page_description  = term_description();
			$this->current_url       = get_category_link( $this->active_category_id );
		} else {
			// phpcs:ignore WordPress.Security.NonceVerification.Recommended
			$this->category_slug = isset( $_GET['category'] ) ? sanitize_text_field( $_GET['category'] ) : '';
			$this->page_title    = __( 'Blog', 'puffergo' );
			$this->page_subtitle = __( 'Sharing insights on global branding, tech architecture, and user experience.', 'puffergo' );
			$this->current_url   = home_url( add_query_arg( null, null ) );
			$this->current_url   = remove_query_arg( array( 's', 'category', 'paged' ), $this->current_url );
		}

		// Hero 背景图（支持 Customizer 覆盖）
		$this->hero_bg_image        = get_theme_mod( 'puffergo_blog_hero_bg', '' );
		$this->hero_bg_image_mobile = get_theme_mod( 'puffergo_blog_hero_bg_mobile', '' );

		// phpcs:ignore WordPress.Security.NonceVerification.Recommended
		$this->search_query = isset( $_GET['s'] ) ? sanitize_text_field( $_GET['s'] ) : '';
		// phpcs:ignore WordPress.Security.NonceVerification.Recommended
		$this->paged = isset( $_GET['paged'] ) ? absint( $_GET['paged'] ) : max( 1, get_query_var( 'paged' ) );

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

	/**
	 * 加载分类列表。
	 */
	private function load_categories() {
		$terms = get_categories( array(
			'orderby'    => 'name',
			'order'      => 'ASC',
			'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,
				'slug' => $term->slug,
				'url'  => get_category_link( $term->term_id ),
			);
		}
	}

	/**
	 * 执行 WP_Query 并收集文章卡片数据。
	 */
	private function load_posts() {
		$query_args = array(
			'post_type'      => 'post',
			'post_status'    => 'publish',
			'posts_per_page' => $this->posts_per_page,
			'paged'          => $this->paged,
		);

		if ( ! empty( $this->search_query ) ) {
			$query_args['s'] = $this->search_query;
		}

		if ( ! empty( $this->category_slug ) ) {
			if ( $this->is_category_page && $this->current_category ) {
				$query_args['cat'] = $this->current_category->term_id;
			} else {
				$query_args['category_name'] = $this->category_slug;
			}
		}

		$query = new WP_Query( $query_args );

		$this->max_pages   = $query->max_num_pages;
		$this->found_posts = $query->found_posts;

		if ( $query->have_posts() ) {
			while ( $query->have_posts() ) {
				$query->the_post();
				$this->posts[] = self::build_post_card( get_the_ID() );
			}
		}

		wp_reset_postdata();
	}

	/**
	 * 构建单个文章卡片数据。
	 *
	 * @param int    $post_id           文章 ID。
	 * @param string $default_image_url 无特色图时的默认图片 URL。
	 * @param string $default_image_alt 无特色图时的默认 alt 文本。
	 * @return array
	 */
	public static function build_post_card( $post_id, $default_image_url = '', $default_image_alt = '' ) {
		$categories       = get_the_category( $post_id );
		$primary_category = ! empty( $categories ) ? $categories[0] : null;

		$category_slug  = $primary_category ? $primary_category->slug : '';
		$category_style = puffergo_get_category_color_style( $category_slug );

		$thumbnail_id = get_post_thumbnail_id( $post_id );
		$image_url    = $thumbnail_id ? get_the_post_thumbnail_url( $post_id, 'large' ) : $default_image_url;
		$image_alt    = $thumbnail_id
			? get_post_meta( $thumbnail_id, '_wp_attachment_image_alt', true )
			: ( $default_image_alt ?: get_the_title( $post_id ) );

		return array(
			'id'             => $post_id,
			'title'          => get_the_title( $post_id ),
			'url'            => get_permalink( $post_id ),
			'image_url'      => $image_url,
			'image_alt'      => $image_alt ?: get_the_title( $post_id ),
			'excerpt'        => wp_trim_words( get_the_excerpt( $post_id ), 50, '...' ),
			'author'         => get_the_author_meta( 'display_name', get_post_field( 'post_author', $post_id ) ),
			'date'           => get_the_date( get_option( 'date_format' ), $post_id ),
			'category_name'  => $primary_category ? $primary_category->name : '',
			'category_slug'  => $category_slug,
			'category_style' => $category_style,
		);
	}

	/**
	 * 生成分页数据（不含 HTML）。
	 * 模板层通过 blog-pagination 组件渲染分页。
	 */
	private function load_pagination() {
		// 分页数据已由 load_posts() 设置（max_pages, found_posts, paged）。
		// 构建含搜索词的基础分页 URL。
		$this->pagination_base_url = $this->current_url;
		if ( ! empty( $this->search_query ) && ! $this->is_category_page ) {
			$this->pagination_base_url = add_query_arg( 's', $this->search_query, $this->current_url );
		}
	}

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

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

		return $items;
	}
}
