<?php

/**
 * @file
 * Provides installations method.
 */

use Drupal\Core\Field\BaseFieldDefinition;
use Drupal\link\LinkItemInterface;

/**
 * Implements hook_install().
 */
function nodehive_core_install() {
  // Add some default permissions.
  $roles = [
    "content_editor",
    "nodehive_content_admin"
  ];

  foreach ($roles as $rid) {
    user_role_grant_permissions(
      $rid,
      [
        "administer nodehive space",
        "administer nodehive users"
      ]);
  }

  foreach (["nodehive-editor", "nodehive-admin"] as $menu_id) {
    // Create a base menu for switching spaces.
    $menu_link = \Drupal::entityTypeManager()->getStorage("menu_link_content")
      ->create([
        'id' => $menu_id,
        'title' => "Switch Space",
        'link' => ['uri' => 'internal:/admin/content/space'],
        'menu_name' => $menu_id,
        'parent' => $menu_id,
        'expanded' => TRUE,
        'weight' => 1,
      ]);
    $menu_link->save();
  }

  // Auto-enable the submodules.
  $installer = \Drupal::service('module_installer');
  $installer->install([
    'nodehive_core_space_dashboard',
    'nodehive_visualeditor'
  ]);
}

/**
 * Implements hook_uninstall().
 */
function nodehive_core_uninstall() {
  // Remove some default permissions.
  $roles = [
    "content_editor",
  ];

  foreach ($roles as $rid) {
    user_role_revoke_permissions($rid, ["administer nodehive space"]);
  }

  foreach (["nodehive-editor", "nodehive-admin"] as $menu_id) {
    // Delete the menu.
    $menu_link = \Drupal::entityTypeManager()->getStorage("menu_link_content")
      ->loadByProperties([
        'title' => "Switch Space",
        'link' => ['uri' => 'internal:/admin/content/space'],
        'menu_name' => $menu_id,
        'parent' => $menu_id,
      ]);

    foreach ($menu_link as $link) {
      $link->delete();
    }
  }
}

/**
 * Implements hook_update_n().
 *
 * Enable translation modules.
 */
function nodehive_core_update_10000() {
  \Drupal::service("module_installer")->install([
    "config_translation",
    "content_translation",
    "locale",
    "language",
  ]);
}

/**
 * Implements hook_update_n().
 *
 * Add space type and space tag fields.
 */
function nodehive_core_update_10001() {
  $space_type_definition = BaseFieldDefinition::create('list_string')
    ->setLabel(t('Space Type'))
    ->setDescription(t('Type of space.'))
    ->setSetting('allowed_values_function', 'nodehive_core_space_type_allowed_values')
    ->setRequired(TRUE)
    ->setCardinality(1)
    ->setDisplayOptions('form', [
      'type' => 'select',
      'weight' => 0,
    ])
    ->setDisplayConfigurable('form', TRUE)
    ->setDisplayConfigurable('view', FALSE);

  \Drupal::entityDefinitionUpdateManager()
    ->installFieldStorageDefinition(
      'type',
      'nodehive_space',
      'nodehive_space',
      $space_type_definition
  );

  // Create new field.
  $tags_definition = BaseFieldDefinition::create('entity_reference')
    ->setLabel(t('Tags'))
    ->setDescription(t('Space tags.'))
    ->setRevisionable(TRUE)
    ->setSetting('target_type', 'taxonomy_term')
    ->setSetting('handler', 'default')
    ->setSetting('handler_settings', [
      'target_bundles' => [
        'nodehive_space_tags' => 'nodehive_space_tags',
      ],
      'auto_create' => TRUE,
      'auto_create_bundle' => 'nodehive_space_tags',
    ])
    ->setCardinality(BaseFieldDefinition::CARDINALITY_UNLIMITED)
    ->setTranslatable(TRUE)
    ->setDisplayOptions('form', [
      'type' => 'entity_reference_autocomplete',
      'weight' => 0,
      'settings' => [
        'match_operator' => 'CONTAINS',
        'size' => '60',
        'placeholder' => '',
      ],
    ]);

  \Drupal::entityDefinitionUpdateManager()
    ->installFieldStorageDefinition(
      'tags',
      'nodehive_space',
      'nodehive_space',
      $tags_definition
    );

  // Create new taxonomy vocabulary.
  $tags_vocabulary = \Drupal::entityTypeManager()
    ->getStorage('taxonomy_vocabulary')
    ->create([
      'vid' => 'nodehive_space_tags',
      'description' => '',
      'name' => 'NodeHive Space Tags',
    ]);
  $tags_vocabulary->save();
}

/**
 * Implements hook_update_n().
 *
 * Migrate to a new space url field.
 */
function nodehive_core_update_10002() {
  // Create new field.
  $space_url_definition = BaseFieldDefinition::create('link')
    ->setLabel(t('Url'))
    ->setDescription(t('The space urls.'))
    ->setRequired(TRUE)
    ->setSettings([
      'link_type' => LinkItemInterface::LINK_EXTERNAL,
      'title' => DRUPAL_DISABLED,
    ])
    ->setDisplayOptions('form', [
      'type' => 'link_default',
      'weight' => 0,
    ])
    ->setCardinality(1)
    ->setDisplayConfigurable('form', TRUE);

  \Drupal::entityDefinitionUpdateManager()
    ->installFieldStorageDefinition(
      'space_url',
      'nodehive_space',
      'nodehive_space',
      $space_url_definition
    );

  $database = \Drupal::database();

  // Retrieve existing field data.
  $urls = $database->select('nodehive_space__url', 'sp')
    ->fields('sp', ['entity_id', 'url_uri', 'url_options'])
    ->execute()
    ->fetchAllKeyed();

  $url_per_entity = [];
  foreach ($urls as $entity_id => $url) {
    if (!isset($url_per_entity[$entity_id])) {
      $url_per_entity[$entity_id] = $url;
    }
  }

  foreach ($url_per_entity as $entity_id => $url) {
    $entity = \Drupal::entityTypeManager()
      ->getStorage('nodehive_space')
      ->load($entity_id);

    $entity->set('space_url', $url);
    $entity->save();
  }
}

/**
 * Implements hook_update_n().
 *
 * Create a new 'space_type' field that replaces the 'type' field.
 */
function nodehive_core_update_10003() {
  // Create a new space_type field.
  $space_type_definition = BaseFieldDefinition::create('list_string')
    ->setLabel(t('Space Type'))
    ->setDescription(t('Type of space.'))
    ->setSetting('allowed_values_function', 'nodehive_core_space_type_allowed_values')
    ->setRequired(TRUE)
    ->setCardinality(1)
    ->setDisplayOptions('form', [
      'type' => 'select',
      'weight' => 0,
    ])
    ->setDisplayConfigurable('form', TRUE)
    ->setDisplayConfigurable('view', FALSE);

  \Drupal::entityDefinitionUpdateManager()
    ->installFieldStorageDefinition(
      'space_type',
      'nodehive_space',
      'nodehive_space',
      $space_type_definition
  );
}