<?php
use Drupal\Core\Entity\EntityTypeInterface;
use Drupal\Core\Field\BaseFieldDefinition;
use Drupal\Core\Field\FieldStorageDefinitionInterface;
use Drupal\mymodule\Plugin\Field\FieldType\MyFieldComputed;


// https://www.drupal.org/project/drupal/issues/2916266#comment-12301574

// $key_value_factory = \Drupal::service('keyvalue');
// $field_map_kv_store = $key_value_factory->get('entity.definitions.bundle_field_map');
// $node_map = $field_map_kv_store->get('node');

// unset($node_map['field_workflow']['bundles']['breve']);
// unset($node_map['field_visuel']['bundles']['breve']);
// unset($node_map['field_video']['bundles']['breve']);
// unset($node_map['field_thesaurus']['bundles']['breve']);
// unset($node_map['field_tags']['bundles']['breve']);
// unset($node_map['field_source']['bundles']['breve']);
// unset($node_map['field_showroom']['bundles']['breve']);
// unset($node_map['field_migration']['bundles']['breve']);
// unset($node_map['field_linked_materials']['bundles']['breve']);
// unset($node_map['field_memo']['bundles']['breve']);

// $field_map_kv_store->set('node', $node_map);

/**
 * Implement hook_entity_bundle_field_info().
 *
 * @param EntityTypeInterface $entity_type
 * @param $bundle
 * @param array $base_field_definitions
 * @return array
 */
function materio_home_entity_bundle_field_info(EntityTypeInterface $entity_type, $bundle, array $base_field_definitions) {
// function materio_home_entity_base_field_info_alter(&$fields, EntityTypeInterface $entity_type) {
  // $fields = array();
  // if ($entity_type->id() == 'node' && $bundle === 'frontpage') {
  // \Drupal::logger('materio_home')->notice('bundle: '.$bundle);
  if ($entity_type->id() == 'node' && $bundle == 'frontpage') {
    $fields['computed_materials_reference'] = BaseFieldDefinition::create('entity_reference')
      ->setName('computed_materials_reference')
      ->setLabel(t('Computed Materials References'))
      ->setDescription(t('Computed Materials References.'))
      // // The Entity Type this field belongs to.
      ->setTargetEntityTypeId($entity_type->id())
      // // The Entity Type bundle this field belongs to.
      ->setTargetBundle($bundle)
      ->setSetting('target_type', 'node')
      ->setCardinality(FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED)
      ->setComputed(TRUE)
      ->setRevisionable(FALSE)
      ->setTranslatable(FALSE)
      ->setDisplayConfigurable('view', TRUE)
      ->setDisplayOptions('view', [
          'label' => 'hidden',
          'weight' => -5,
        ])
      ->setClass(\Drupal\materio_home\Plugin\Field\FieldType\ComputedMaterialsReferences::class);

    $fields['computed_showrooms_reference'] = BaseFieldDefinition::create('entity_reference')
      ->setName('computed_showrooms_reference')
      ->setLabel(t('Computed Showrooms References'))
      ->setDescription(t('Computed Showrooms References.'))
      // // The Entity Type this field belongs to.
      ->setTargetEntityTypeId($entity_type->id())
      // // The Entity Type bundle this field belongs to.
      ->setTargetBundle($bundle)
      ->setSetting('target_type', 'taxonomy_term')
      ->setCardinality(FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED)
      ->setComputed(TRUE)
      ->setRevisionable(FALSE)
      ->setTranslatable(FALSE)
      ->setDisplayConfigurable('view', TRUE)
      ->setDisplayOptions('view', [
          'label' => 'hidden',
          'weight' => -5,
        ])
      ->setClass(\Drupal\materio_home\Plugin\Field\FieldType\ComputedShowroomsReferences::class);

    $fields['computed_articles_reference'] = BaseFieldDefinition::create('entity_reference')
      ->setName('computed_articles_reference')
      ->setLabel(t('Computed Articles References'))
      ->setDescription(t('Computed Articles References.'))
      // // The Entity Type this field belongs to.
      ->setTargetEntityTypeId($entity_type->id())
      // // The Entity Type bundle this field belongs to.
      ->setTargetBundle($bundle)
      ->setSetting('target_type', 'node')
      ->setCardinality(FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED)
      ->setComputed(TRUE)
      ->setRevisionable(FALSE)
      ->setTranslatable(FALSE)
      ->setDisplayConfigurable('view', TRUE)
      ->setDisplayOptions('view', [
          'label' => 'hidden',
          'weight' => -5,
        ])
      ->setClass(\Drupal\materio_home\Plugin\Field\FieldType\ComputedArticlesReferences::class);

      return $fields;
  }
}
/**
 * Implement hook_entity_base_field_info_alter().
 *
 * @param $fields
 * @param EntityTypeInterface $entity_type
 */

function materio_home_entity_base_field_info_alter(&$fields, EntityTypeInterface $entity_type) {
  if ($entity_type->id() == 'node') {
    if (isset($fields['title'])) {
      $fields['title']->setDisplayConfigurable('view', TRUE);
    }
  }
}

/**
 * Implement hook_cron().
 *
 */
function materio_home_cron(){
  $logger = \Drupal::logger('materio_home');
  // recompile every 5 minutes
  // $request_time = \Drupal::time()->getRequestTime();
  // if ($request_time - \Drupal::state()->get('materio_home.last_recompute') >= 300) {
    // Short-running operation example, not using a queue
    $query = \Drupal::entityQuery('node')
      ->condition('status', 1)
      ->condition('type', 'frontpage');
    $nids = $query->execute();
    $nodes = entity_load_multiple('node', $nids);
    foreach ($nodes as $nid => $node) {
      $logger->notice('cron | regenerating computed fields for '.$nid);
      $node->save();
    }
    // \Drupal::state()->set('materio_home.last_recompute', $request_time);
  // }
}


/**
 * Implements hook_theme().
 */
// function materio_home_theme($existing, $type, $theme, $path) {
//   // @see https://www.drupal.org/docs/8/theming/twig/create-custom-twig-templates-from-custom-module
//
//   return array(
//     'materio_home' => array(
//       // 'render element' => '',
//       'file' => 'includes/materio_home.inc',
//       'variables' => array(
//         'frontpage_node' => NULL,
//       ),
//     ),
//   );
// }




// /**
//  * implements hook_entity_extra_field_info
//  *
//  */
// function materio_home_entity_extra_field_info() {
//   $extra = [];
//   // $extra['node']['frontpage']['form']['computed_materials_reference'] = [
//   //   'label' => t('Computed Materials References'),
//   //   'description' => t('Computed Materials References'),
//   //   'weight' => 10,
//   // ];
//   // $extra['node']['frontpage']['display']['computed_materials_reference'] = [
//   //   'label' => t('Computed Materials References'),
//   //   'description' => t('Computed Materials References'),
//   //   'weight' => 10,
//   // ];
//   return $extra;
// }
//
// /**
//  * Implements hook_install().
//  */
// function materio_home_install() {
//   $entity_type = \Drupal::service('entity_type.manager')->getDefinition('node');
//   \Drupal::service('entity.definition_update_manager')->updateEntityType($entity_type);
// }
//
// /**
//  * Implements hook_uninstall().
//  */
// function materio_home_uninstall() {
//   $entity_type = \Drupal::service('entity_type.manager')->getDefinition('node');
//   \Drupal::service('entity.definition_update_manager')->updateEntityType($entity_type);
// }