<?php

declare(strict_types=1);

namespace Drupal\KernelTests\Components;

use Drupal\Core\Template\ComponentNodeVisitor;
use PHPUnit\Framework\Attributes\CoversClass;
use PHPUnit\Framework\Attributes\Group;
use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;

/**
 * Tests the node visitor.
 */
#[CoversClass(ComponentNodeVisitor::class)]
#[Group('sdc')]
#[RunTestsInSeparateProcesses]
class ComponentNodeVisitorTest extends ComponentKernelTestBase {

  /**
   * {@inheritdoc}
   */
  protected static $modules = ['system', 'sdc_other_node_visitor'];

  /**
   * {@inheritdoc}
   */
  protected static $themes = ['sdc_theme_test'];

  const DEBUG_COMPONENT_ID_PATTERN = '/<!-- ([\n\s\S]*) Component start: ([\SA-Za-z+-:]+) -->/';
  const DEBUG_VARIANT_ID_PATTERN = '/<!-- [\n\s\S]* with variant: "([\SA-Za-z+-]+)" -->/';

  /**
   * Test that other visitors can modify Twig nodes.
   */
  public function testOtherVisitorsCanModifyTwigNodes(): void {
    $build = [
      '#type' => 'inline_template',
      '#template' => "{% embed('sdc_theme_test_base:my-card-no-schema') %}{% block card_body %}Foo bar{% endblock %}{% endembed %}",
    ];
    $this->renderComponentRenderArray($build);

    // If this is reached, the test passed.
    $this->assertTrue(TRUE);
  }

  /**
   * Test debug output for sdc components with component id and variant.
   */
  public function testDebugRendersComponentStartWithVariant(): void {
    // Enable twig theme debug to ensure that any
    // changes to theme debugging format force checking
    // that the auto paragraph filter continues to be applied
    // correctly.
    $twig = \Drupal::service('twig');
    $twig->enableDebug();

    $build = [
      '#type' => 'component',
      '#component' => 'sdc_theme_test:my-card',
      '#variant' => 'vertical',
      '#props' => [
        'header' => 'My header',
      ],
      '#slots' => [
        'card_body' => 'Foo bar',
      ],
    ];
    $crawler = $this->renderComponentRenderArray($build);
    $content = $crawler->html();

    $matches = [];
    \preg_match_all(self::DEBUG_COMPONENT_ID_PATTERN, $content, $matches);
    $this->assertSame($matches[2][0], 'sdc_theme_test:my-card');

    \preg_match_all(self::DEBUG_VARIANT_ID_PATTERN, $content, $matches);
    $this->assertSame($matches[1][0], 'vertical');
  }

}
