<?php

/**
 * @file
 * Hooks and customizations for the farm_l10n module.
 */

declare(strict_types=1);

use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Render\Element;
use Drupal\Core\Routing\RouteMatchInterface;
use Drupal\Core\Url;

/**
 * Implements hook_help().
 */
function farm_l10n_help($route_name, RouteMatchInterface $route_match) {
  $output = '';

  // Help text for the farm/settings/language form.
  if ($route_name == 'farm_l10n.settings') {
    $output .= '<p>' . t('Select the default language for the user interface. Individual users can override this by editing their profile.') . '</p>';
  }

  return $output;
}

/**
 * Implements hook_entity_bundle_info_alter().
 */
function farm_l10n_entity_bundle_info_alter(&$bundles) {

  // If the content translation module is not enabled, alter all entity type
  // bundles to mark them as not translatable. This fixes an issue with
  // JSON:API PATCH requests when authenticated as a user with a non-default
  // language.
  // @see https://www.drupal.org/project/farm/issues/3335267
  if (\Drupal::moduleHandler()->moduleExists('content_translation')) {
    return;
  }
  foreach ($bundles as $entity_type => $entity_type_bundles) {
    foreach ($entity_type_bundles as $bundle => $bundle_info) {
      if (!empty($bundle_info['translatable']) && $bundle_info['translatable'] === TRUE) {
        $bundles[$entity_type][$bundle]['translatable'] = FALSE;
      }
    }
  }
}

/**
 * Implements hook_form_FORM_ID_alter().
 */
function farm_l10n_form_language_admin_overview_form_alter(&$form, FormStateInterface $form_state, $form_id) {

  // Disable the ability to change the site's default language and direct users
  // to /farm/settings/language instead.
  // @see https://www.drupal.org/project/farm/issues/3257430
  $message = t('To change the default language of farmOS, please go to <a href=":url">farmOS language settings</a>.', [':url' => Url::fromRoute('farm_l10n.settings')->toString()]);
  \Drupal::messenger()->addWarning($message);
  foreach (Element::children($form['languages']) as $langcode) {
    $form['languages'][$langcode]['default']['#access'] = FALSE;
  }
}

/**
 * Implements hook_form_FORM_ID_alter().
 */
function farm_l10n_form_user_register_form_alter(&$form, FormStateInterface $form_state, $form_id) {

  // Use the "Selected language" as the default for new users (unless it is
  // still set to "site_default").
  $selected_language = \Drupal::config('language.negotiation')->get('selected_langcode');
  if ($selected_language == 'site_default') {
    return;
  }
  if (!empty($form['language']['preferred_langcode'])) {
    $form['language']['preferred_langcode']['#default_value'] = $selected_language;
  }
  if (!empty($form['language']['preferred_admin_langcode'])) {
    $form['language']['preferred_admin_langcode']['#default_value'] = $selected_language;
  }
}
