<?php

namespace Drupal\Tests\quickedit\FunctionalJavascript;

use Drupal\editor\Entity\Editor;
use Drupal\filter\Entity\FilterFormat;
use Drupal\FunctionalJavascriptTests\WebDriverTestBase;
use Drupal\node\Entity\Node;
use Drupal\node\Entity\NodeType;
use Drupal\Tests\contextual\FunctionalJavascript\ContextualLinkClickTrait;

/**
 * Tests quickedit.
 *
 * @group quickedit
 */
class FieldTest extends WebDriverTestBase {

  use ContextualLinkClickTrait;

  /**
   * {@inheritdoc}
   */
  public static $modules = [
    'node',
    'ckeditor',
    'contextual',
    'quickedit',
  ];

  /**
   * {@inheritdoc}
   */
  protected function setUp() {
    parent::setUp();

    // Create a text format and associate CKEditor.
    $filtered_html_format = FilterFormat::create([
      'format' => 'filtered_html',
      'name' => 'Filtered HTML',
      'weight' => 0,
    ]);
    $filtered_html_format->save();

    Editor::create([
      'format' => 'filtered_html',
      'editor' => 'ckeditor',
    ])->save();

    // Create note type with body field.
    $node_type = NodeType::create(['type' => 'page', 'name' => 'Page']);
    $node_type->save();
    node_add_body_field($node_type);

    $account = $this->drupalCreateUser([
      'access content',
      'administer nodes',
      'edit any page content',
      'use text format filtered_html',
      'access contextual links',
      'access in-place editing',
    ]);
    $this->drupalLogin($account);

  }

  /**
   * Tests that quickeditor works correctly for field with CKEditor.
   */
  public function testFieldWithCkeditor() {
    $body_value = '<p>Sapere aude</p>';
    $node = Node::create([
      'type' => 'page',
      'title' => 'Page node',
      'body' => [['value' => $body_value, 'format' => 'filtered_html']],
    ]);
    $node->save();

    $page = $this->getSession()->getPage();
    $assert = $this->assertSession();

    $this->drupalGet('node/' . $node->id());

    // Wait "Quick edit" button for node.
    $this->assertSession()->waitForElement('css', '[data-quickedit-entity-id="node/' . $node->id() . '"] .contextual .quickedit');
    // Click by "Quick edit".
    $this->clickContextualLink('[data-quickedit-entity-id="node/' . $node->id() . '"]', 'Quick edit');
    // Switch to body field.
    $page->find('css', '[data-quickedit-field-id="node/' . $node->id() . '/body/en/full"]')->click();
    // Wait and click by "Blockquote" button from editor for body field.
    $this->assertSession()->waitForElementVisible('css', '.cke_button.cke_button__blockquote')->click();
    // Wait and click by "Save" button after body field was changed.
    $this->assertSession()->waitForElementVisible('css', '.quickedit-toolgroup.ops [type="submit"][aria-hidden="false"]')->click();
    // Wait until the save occurs and the editor UI disappears.
    $this->waitForNoElement('.cke_button.cke_button__blockquote');
    // Ensure that the changes take effect.
    $assert->responseMatches("|<blockquote>\s*$body_value\s*</blockquote>|");
  }

  /**
   * Waits for an element to be removed from the page.
   *
   * @param string $selector
   *   CSS selector.
   * @param int $timeout
   *   (optional) Timeout in milliseconds, defaults to 10000.
   */
  protected function waitForNoElement($selector, $timeout = 10000) {
    $condition = "(typeof jQuery !== 'undefined' && jQuery('$selector').length === 0)";
    $this->assertJsCondition($condition, $timeout);
  }

}
