<?php

namespace App\Services\LiquidTags;

use App\Models\SitePageTag; // 引入 SitePageTag 模型
use Liquid\AbstractBlock;
use App\Services\LiquidRenderer;

class LiquidTagCollection extends AbstractBlock
{
    private $tagSlug;
    private $limit;
    private $templateFile;

    // 构造函数解析传入的参数
    public function __construct($markup, array &$tokens, $file_system = null)
    {
        // 初始化默认值
        $this->tagSlug = null;
        $this->limit = 10; // 默认显示 10 篇
        $this->templateFile = null;

        // 正则表达式解析传入的参数
        $syntax = '/(\w+)=("[^"]*"|\'[^\']*\'|\d+)/';

        if (preg_match_all($syntax, $markup, $matches, PREG_SET_ORDER)) {
            foreach ($matches as $match) {
                $key = $match[1];
                $value = trim($match[2], '\"\''); // 去除引号

                switch ($key) {
                    case 'slug':
                        $this->tagSlug = $value;  // 获取 slug 参数
                        break;
                    case 'limit':
                        $this->limit = (int)$value; // 设置文章数量限制
                        break;
                    case 'template':
                        $this->templateFile = $value; // 设置模板文件
                        break;
                }
            }
        }
    }

    // render 方法执行逻辑并返回渲染结果
    public function render($context)
    {
        // 如果传入了 slug，就根据 slug 获取文章
        if ($this->tagSlug) {
            return $this->renderTagPages();
        }

        // 如果没有提供 slug，则返回空字符串
        return '';
    }

    // 根据 tagSlug 获取与标签关联的文章
    private function renderTagPages()
    {
        // 调用 SitePageTag 模型的 getBySlug 方法来获取与标签关联的页面
        $pages = SitePageTag::getBySlug($this->tagSlug, $this->limit);


        if (!$pages) {
            return ''; // 如果没有找到页面，返回空字符串
        }

        // 如果有文章，渲染模板
        return $this->renderTemplate(['pages' => $pages->items()]);
    }

    // 渲染模板
    private function renderTemplate(array $data)
    {
        if (!$this->templateFile) {
            return ''; // 如果未提供模板文件，返回空字符串
        }

        // 使用 LiquidRenderer 渲染模板
        return LiquidRenderer::render($this->templateFile, $data);
    }
}
