<?php

/**
 * @file
 * This module adds the "Fluidproject UI Options" project library to your site.
 */

/**
 * Implements template_preprocess_page().
 */
function fluidui_preprocess_page(&$variables) {
  $route = \Drupal::routeMatch()->getRouteObject();

  $is_admin = \Drupal::service('router.admin_context')->isAdminRoute($route);

  $current_path = \Drupal::service('path.current')->getPath();

  $url_alias = \Drupal::service('path_alias.manager')->getAliasByPath($current_path);

  $config = \Drupal::config("fluidui.adminsettings");

  $admin_display = $config->get('admin_display');

  $url_blacklist = $config->get('url_blacklist') !== NULL ? explode("\r\n", $config->get('url_blacklist')) : [''];

  // The url blacklist takes precedence.
  if (in_array($current_path, $url_blacklist) || in_array($url_alias, $url_blacklist)) {
    $variables['page']['#cache']['contexts'][] = 'fluidui';
    return;
  }

  if ($admin_display) {
    // Display the widget on all pages.
    $variables['page']['#cache']['contexts'][] = 'fluidui';
    $variables['#attached']['library'][] = 'fluidui/fluidui.infusion';
    $variables['#attached']['library'][] = 'fluidui/fluidui.theme';
  }
  else {
    // don't display the widget on the admin pages.
    if (!$is_admin) {
      $variables['page']['#cache']['contexts'][] = 'fluidui';
      $variables['#attached']['library'][] = 'fluidui/fluidui.infusion';
      $variables['#attached']['library'][] = 'fluidui/fluidui.theme';
    }
  }

  $library_folder = base_path() . 'libraries';

  if (file_exists(DRUPAL_ROOT . $library_folder . "/infusion")) {
    // Use latest version from /libraries/infusion.
    $module_path = $library_folder;
  }
  else {
    // Use module version.
    $module_path = "/" . \Drupal::service('extension.list.module')->getPath('fluidui');
  }

  $variables['#attached']['drupalSettings']['modulePath'] = $module_path;

  $translations_directory = 'public://fluidui-translations/';

  if (file_exists($translations_directory)) {
    $variables['#attached']['drupalSettings']['translationsDirectory'] = "/sites/default/files/fluidui-translations/";
  }
  else {
    $variables['#attached']['drupalSettings']['translationsDirectory'] = "";
  }
}

/**
 * Implements template_preprocess_html().
 */
function fluidui_preprocess_html(&$variables) {
  // Read the fluid cookie first.
  if (isset($_COOKIE['fluid-ui-settings'])) {
    $vals = (array) json_decode($_COOKIE['fluid-ui-settings']);

    if (isset($vals['preferences']->fluid_prefs_contrast)) {
      $variables['attributes']['class'][] = 'fl-theme-' . $vals['preferences']->fluid_prefs_contrast;
    }

    if (isset($vals['preferences']->fluid_prefs_enhanceInputs)) {
      $variables['fl-input-enhanced']['class'][] = 'fl-input-enhanced';
    }

    if (isset($vals['preferences']->fluid_prefs_textFont)) {
      $variables['attributes']['class'][] = 'fl-font-' . $vals['preferences']->fluid_prefs_textFont;
    }

    if (isset($vals['preferences']->fluid_prefs_lineSpace)) {
      $variables['attributes']['style']['line-height'] = 3;
    }
  }
}

/**
 * Implements hook_page_top().
 */
function fluidui_page_top(array &$page_top) {
  $route = \Drupal::routeMatch()->getRouteObject();

  $is_admin = \Drupal::service('router.admin_context')->isAdminRoute($route);

  $current_path = \Drupal::service('path.current')->getPath();

  $url_alias = \Drupal::service('path_alias.manager')->getAliasByPath($current_path);

  $config = \Drupal::config("fluidui.adminsettings");

  $admin_display = $config->get('admin_display');

  $url_blacklist = $config->get('url_blacklist') !== NULL ? explode("\r\n", $config->get('url_blacklist')) : [''];

  // The url blacklist takes precedence.
  if (in_array($current_path, $url_blacklist) || in_array($url_alias, $url_blacklist)) {
    $variables['page']['#cache']['contexts'][] = 'fluidui';

    return;
  }

  if ($admin_display) {
    $page_top['fluidui'] = [
      '#theme' => 'fluid_ui_block',
    ];
  }
  else {
    // Don't display the widget on the admin pages.
    if (!$is_admin) {
      $page_top['fluidui'] = [
        '#theme' => 'fluid_ui_block',
      ];
    }
  }
}

/**
 * Implements hook_theme().
 */
function fluidui_theme() {
  return [
    'fluid_ui_block' => [
      'render element' => 'content',
    ],
  ];
}

/**
 * Implements hook_library_info_alter().
 */
function fluidui_library_info_alter(&$libraries, $extension) {
  if (isset($libraries['fluidui.infusion'])) {
    // Verify if /libraries/infusion exists.
    $library_folder = base_path() . 'libraries/';

    if (file_exists(DRUPAL_ROOT . $library_folder . "infusion")) {
      foreach ($libraries['fluidui.infusion']['css']['base'] as $key => $library) {
        $libraries['fluidui.infusion']['css']['base'][$library_folder . $key] = $library;
        unset($libraries['fluidui.infusion']['css']['base'][$key]);
      }

      foreach ($libraries['fluidui.infusion']['js'] as $key => $library) {
        $libraries['fluidui.infusion']['js'][$library_folder . $key] = $library;
        unset($libraries['fluidui.infusion']['js'][$key]);
      }
    }
  }
}