{% extends "base/class.php.twig" %}

{% block file_path %}
\Drupal\{{ module }}\Plugin\Condition\{{ class_name }}.
{% endblock %}

{% block namespace_class %}
namespace Drupal\{{ module }}\Plugin\Condition;
{% endblock %}

{% block use_class %}
use Drupal\Core\Condition\ConditionPluginBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Plugin\Context\ContextDefinition;
{% endblock %}

{% block class_declaration %}
/**
 * Provides a '{{ label }}' condition to enable a condition based in module selected status.
 *
 * @Condition(
 *   id = "{{ plugin_id }}",
 *   label = @Translation("{{ label }}"),
 *   context = {
 *     "{{ context_id }}" = @ContextDefinition("{{ context_definition_id }}", required = {{ context_definition_required }} , label = @Translation("{{ context_definition_label }}"))
 *   }
 * )
 *
 */
class {{ class_name }} extends ConditionPluginBase {% endblock %}
{% block class_methods %}
  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
    $instance = parent::create($container, $configuration, $plugin_id, $plugin_definition);
    return $instance;
  }

  /**
   * {@inheritdoc}
   */
  public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
    // Sort all modules by their names.
    $modules = \Drupal::service('extension.list.module')->getList();
    uasort($modules, 'system_sort_modules_by_info_name');

    $options = [NULL => t('Select a module')];
    foreach ($modules as $module_id => $module) {
      $options[$module_id] = $module->info['name'];
    }

    $form['module'] = [
      '#type' => 'select',
      '#title' => $this->t('Select a module to validate'),
      '#default_value' => $this->configuration['module'],
      '#options' => $options,
      '#description' => $this->t('Module selected status will be use to evaluate condition.'),
    ];

    return parent::buildConfigurationForm($form, $form_state);
  }

  /**
   * {@inheritdoc}
   */
  public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
    $this->configuration['module'] = $form_state->getValue('module');
    parent::submitConfigurationForm($form, $form_state);
  }

  /**
   * {@inheritdoc}
   */
  public function defaultConfiguration() {
    return ['module' => ''] + parent::defaultConfiguration();
  }

  /**
   * Evaluates the condition and returns TRUE or FALSE accordingly.
   *
   * @return bool
   *   TRUE if the condition has been met, FALSE otherwise.
   */
  public function evaluate() {
    if (empty($this->configuration['module']) && !$this->isNegated()){
        return TRUE;
    }

    $module = $this->configuration['module'];
    $modules = \Drupal::service('extension.list.module')->getList();

    return $modules[$module]->status;
  }

  /**
   * Provides a human readable summary of the condition's configuration.
   */
  public function summary() {
    $module = $this->getContextValue('module');
    $modules = \Drupal::service('extension.list.module')->getList();

    $status = ($modules[$module]->status)?t('enabled'):t('disabled');

    return t('The module @module is @status.', ['@module' => $module, '@status' => $status]);
  }
{% endblock %}
