<?php

/**
 * @file
 * Main module file for override_node_options.
 */

use Drupal\Core\Access\AccessResult;
use Drupal\Core\Form\FormStateInterface;
use Drupal\node\NodeForm;

/**
 * Implements hook_form_alter().
 */
function override_node_options_form_alter(array &$form, FormStateInterface $form_state) {
  $form_object = $form_state->getFormObject();

  if ($form_object instanceof NodeForm) {
    /** @var Drupal\Core\Session\AccountProxyInterface $user */
    $user = \Drupal::currentUser();

    if ($user->hasPermission('administer nodes')) {
      return;
    }

    $node_type = $form_object->getEntity()->bundle();

    $form['revision']['#access'] = $user->hasPermission("override $node_type revision option")
      || $user->hasPermission('override all revision option');
  }
}

/**
 * Implements hook_entity_field_access_alter().
 */
function override_node_options_entity_field_access_alter(array &$grants, array $context) {
  $entity_type = $context['field_definition']->getTargetEntityTypeId();

  if ($entity_type == 'node' && $context['operation'] == 'edit' && !$context['account']->hasPermission('administer nodes')) {
    $bundle = $context['items']->getEntity()->bundle();

    switch ($context['field_definition']->getName()) {
      case 'promote':
        $grants[':default'] = AccessResult::allowedIfHasPermissions(
          $context['account'],
          [
            "override $bundle promote to front page option",
            'override all promote to front page option',
          ],
          'OR'
        );
        break;

      case 'sticky':
        $grants[':default'] = AccessResult::allowedIfHasPermissions(
          $context['account'],
          [
            "override $bundle sticky option",
            'override all sticky option',
          ],
          'OR'
        );
        break;

      case 'revision_log':
        $grants[':default'] = AccessResult::allowedIfHasPermissions(
          $context['account'],
          [
            "enter $bundle revision log entry",
            'enter all revision log entry',
          ],
          'OR'
        );
        break;

      case 'created':
        $grants[':default'] = AccessResult::allowedIfHasPermissions(
          $context['account'],
          [
            "override $bundle authored on option",
            'override all authored on option',
          ],
          'OR'
        );
        break;

      case 'uid':
        $grants[':default'] = AccessResult::allowedIfHasPermissions(
          $context['account'],
          [
            "override $bundle authored by option",
            'override all authored by option',
          ],
          'OR'
        );
        break;

      case 'status':
        $grants[':default'] = AccessResult::allowedIfHasPermissions(
          $context['account'],
          [
            "override $bundle published option",
            'override all published option',
          ],
          'OR'
        );
        break;
    }
  }
}
