<?php

/**
 * @file
 * Contains hook implementations for Parade conditional field.
 */

use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Url;
use Drupal\parade_conditional_field\Entity\ParadeConditionalField;

/**
 * Implements hook_form_alter().
 *
 * Add parade conditional field settings if there is paragraphs reference field.
 */
function parade_conditional_field_form_alter(&$form, FormStateInterface $form_state, $form_id) {
  if (isset($form['parade_onepage_sections'])) {
    _parade_conditional_field_add_parade_field_conditions($form, $form_state);
  }
}

/**
 * Implements hook_element_info_alter().
 *
 * Add element afterbuild for 'container' type - the paragraphs reference
 * subform element.
 *
 * @see parade_conditional_fields_element_after_build()
 */
function parade_conditional_field_element_info_alter(array &$types) {
  $types['container']['#after_build'][] = 'parade_conditional_fields_element_after_build';
}

/**
 * Add paragraphs bundle machine name to subform wrapper as class.
 */
function parade_conditional_fields_element_after_build($element, FormStateInterface &$form_state) {
  if (isset($element['subform'], $element['top']['paragraph_type_title']) && isset($form_state->getValues()['parade_onepage_sections'])) {
    // Add paragraphs bundle machine name to wrapper as class.
    $elementEntity = $form_state->getStorage()['field_storage']['#parents']['#fields']['parade_onepage_sections']['paragraphs'][$element['#weight']]['entity'];
    if (!empty($elementEntity) && method_exists($elementEntity, 'getType')) {
      $bundle = $elementEntity->getType();
      $element['#prefix'] = str_replace('<div ', '<div class="paragraphs-wrapper-bundle-' . $bundle . '" ', $element['#prefix']);
    }
  }
  return $element;
}

/**
 * Attache Parade conditional field js library, pass conditions to js.
 *
 * @param array $form
 *   An associative array containing the structure of the form.
 * @param \Drupal\Core\Form\FormStateInterface $form_state
 *   The current state of the form.
 */
function _parade_conditional_field_add_parade_field_conditions(array &$form, FormStateInterface $form_state) {
  $conditions = ParadeConditionalField::loadConditionsMultiple();
  if (!$conditions) {
    return;
  }

  $form['#attached']['library'][] = 'parade_conditional_field/conditional_field';
  $form['#attached']['drupalSettings']['paradeConditionalFields'] = $conditions;
}

/**
 * Implements hook_entity_operation().
 *
 * Add 'Parade conditional fields' operation to Paragraphs bundles.
 */
function parade_conditional_field_entity_operation(EntityInterface $entity) {
  $operations = [];
  $info = $entity->getEntityType();
  if (($bundle_of = $info->getBundleOf()) && $entity->getEntityType()->id() === 'paragraphs_type') {
    $account = \Drupal::currentUser();
    if ($account->hasPermission('administer paragraphs types')) {
      $operations['parade-conditional-field'] = [
        'title' => t('Parade conditional fields'),
        'weight' => 25,
        'url' => Url::fromRoute("entity.{$bundle_of}.parade_conditional_field", [
          $entity->getEntityTypeId() => $entity->id(),
        ]),
      ];
    }
  }

  return $operations;
}
