<?php

namespace Acms\Services\Template\Twig\TokenParser;

use Twig\TokenParser\AbstractTokenParser;
use Twig\Token;
use Twig\Node\Node;
use Twig\Compiler;

class MarkdownTokenParser extends AbstractTokenParser
{
    public function parse(Token $token)
    {
        $lineno = $token->getLine();
        $stream = $this->parser->getStream();

        $stream->expect(Token::BLOCK_END_TYPE);
        $body = $this->parser->subparse([$this, 'decideMarkdownEnd'], true);
        $stream->expect(Token::BLOCK_END_TYPE);

        return new MarkdownNode($body, $lineno, $this->getTag());
    }

    public function decideMarkdownEnd(Token $token)
    {
        return $token->test('endmarkdown');
    }

    public function getTag()
    {
        return 'markdown';
    }
}

class MarkdownNode extends Node
{
    public function __construct(Node $body, $lineno, $tag = null)
    {
        parent::__construct(['body' => $body], [], $lineno, $tag);
    }

    public function compile(Compiler $compiler)
    {
        // 'markdown' サービス解決に変更（サービス差し替え機構: docs/steering/20260830-service-override-mechanism/design.md）。
        // Why not: Twig のコンパイル済みテンプレートキャッシュには compile() 時点の PHP がそのまま
        // 残るため、override() / extend() 導入後にキャッシュ済みテンプレートを差し替えても
        // 反映されない。アップデート時は Twig キャッシュのクリアが必要（移行ガイドに記載）。
        $compiler
            ->addDebugInfo($this)
            ->write("ob_start();\n")
            ->subcompile($this->getNode('body'))
            ->write("\$markdownContent = ob_get_clean();\n")
            ->write("\$converter = \Acms\Services\Facades\Application::make('markdown');\n")
            ->write("echo \$converter->convert(\$markdownContent);\n");
    }
}
