<?php

/**
 * @file
 * Installation functionality for the recurring events registration module.
 */

use Drupal\Core\Field\BaseFieldDefinition;
use Drupal\recurring_events_registration\Plugin\Field\ComputedRegistrantTitleFieldItemList;

/**
 * Install the schema updates for eventseries entities to add registration.
 *
 * @see hook_install()
 */
function recurring_events_registration_install() {
  $storage_definition = BaseFieldDefinition::create('event_registration')
    ->setName('event_registration')
    ->setLabel(t('Event Registration'))
    ->setDescription('The event registration configuration.')
    ->setDisplayConfigurable('form', TRUE)
    ->setDisplayConfigurable('view', TRUE)
    ->setRevisionable(TRUE)
    ->setTranslatable(FALSE)
    ->setCardinality(1)
    ->setRequired(FALSE)
    ->setDisplayOptions('form', [
      'type' => 'event_registration',
      'weight' => 4,
    ]);

  \Drupal::entityDefinitionUpdateManager()
    ->installFieldStorageDefinition('event_registration', 'eventseries', 'eventseries', $storage_definition);

  // When enabling registrations make sure we create all the registrant types
  // to match the existing series and instance types.
  foreach (\Drupal::entityTypeManager()->getStorage('eventseries_type')->loadMultiple() as $type) {
    $registrant_type = \Drupal::entityTypeManager()->getStorage('registrant_type')->load($type->id());
    if (empty($registrant_type)) {
      $registrant_type = \Drupal::entityTypeManager()->getStorage('registrant_type')->create([
        'id' => $type->id(),
        'label' => $type->label(),
        'description' => $type->getDescription(),
      ]);
      $registrant_type->save();
    }
  }
}

/**
 * Add the computed title field to registrants.
 */
function recurring_events_registration_update_8001() {
  $storage_definition = BaseFieldDefinition::create('string')
    ->setLabel(t('Title'))
    ->setReadOnly(TRUE)
    ->setComputed(TRUE)
    ->setClass(ComputedRegistrantTitleFieldItemList::class);

  \Drupal::entityDefinitionUpdateManager()
    ->installFieldStorageDefinition('title', 'registrant', 'registrant', $storage_definition);

  // Configure the registrants title field.
  \Drupal::configFactory()->getEditable('recurring_events_registration.registrant.config')
    ->set('title', '[registrant:email]')
    ->save(TRUE);
}

/**
 * Install the new type basefields for registrant.
 */
function recurring_events_registration_update_8002() {
  $registrant_type = BaseFieldDefinition::create('entity_reference')
    ->setLabel(t('Bundle'))
    ->setDescription(t('The registrant type.'))
    ->setSetting('target_type', 'registrant_type')
    ->setReadOnly(TRUE);

  \Drupal::entityDefinitionUpdateManager()->installFieldStorageDefinition('bundle', 'registrant', 'registrant', $registrant_type);
}