<?php
namespace App\Services\LiquidTags;

use App\Models\SiteBanner;
use Liquid\AbstractBlock;
use App\Services\LiquidRenderer;

class LiquidTagBanner extends AbstractBlock
{
    private $limit;
    private $position;
    private $templateFile;
    private $bannerId;

    // 构造函数用于解析传入的参数
    public function __construct($markup, array &$tokens, $file_system = null)
    {
        // 初始化默认值
        $this->limit = 10;
        $this->position = 1;  // 默认位置1
        $this->templateFile = null;
        $this->bannerId = 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 'limit':
                        $this->limit = (int)$value;
                        break;
                    case 'position':
                        $this->position = (int)$value;
                        break;
                    case 'template':
                        $this->templateFile = $value;
                        break;
                    case 'banner_id':  // 解析传入的 banner_id 参数
                        $this->bannerId = (int)$value;
                        break;
                }
            }
        }

    }

    // render 方法执行逻辑并返回渲染结果
    public function render($context)
    {

        // 如果传入了 banner_id 参数，则渲染单个 Banner
        if ($this->bannerId > 0) {
            return $this->renderSingle($this->bannerId);
        } else {
            // 否则渲染多个 Banner
            return $this->renderList();
        }
    }

    // 渲染多个 Banner
    private function renderList()
    {


        // 从数据库获取符合条件的 Banner 列表
        $banners = SiteBanner::getBanners($this->position, $this->limit);




        // 如果有符合条件的 Banner，渲染模板
        if ($banners->count() > 0) {
            return $this->renderTemplate(['banners' => $banners->toArray()]);
        }

        // 如果没有符合条件的 Banner，返回空字符串
        return '';
    }

    // 渲染单个 Banner
    private function renderSingle($bannerId)
    {
        // 从数据库获取指定 id 的 Banner
        $banner = SiteBanner::getBannerById($bannerId, $this->position);

        // 如果 Banner 存在，渲染模板
        if ($banner) {
            return $this->renderTemplate(['banner' => $banner->toArray()]);
        }

        // 如果没有符合条件的 Banner，返回空字符串
        return '';
    }

    // 渲染模板
    private function renderTemplate(array $data)
    {

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



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