<?php
namespace MobilizonConnector;

// Exit if this file is called directly.
if (!defined('ABSPATH')) {
  exit;
}

class Settings {

  private static $DEFAULT_OPTION_URL = 'https://mobilizon.fr';
  private static $DEFAULT_IS_SHORT_OFFSET_NAME_SHOWN = false;
  private static $PAGE_NAME = 'wordpress_mobilizon';
  private static $OPTIONS_GROUP_NAME = 'wordpress_mobilizon';
  private static $OPTION_NAME_IS_SHORT_OFFSET_NAME_SHOWN = 'wordpress_mobilizon_is_short_offset_name_shown';
  private static $OPTION_NAME_URL = 'wordpress_mobilizon_url';
  private static $SETTING_FIELD_NAME_IS_SHORT_OFFSET_NAME_SHOWN = 'wordpress_mobilizon_field_is_short_offset_name_shown';
  private static $SETTING_FIELD_NAME_URL = 'wordpress_mobilizon_field_url';
  private static $SETTINGS_SECTION_NAME = 'wordpress_mobilizon_section_general';

  public static function init() {
    add_action('admin_init', 'MobilizonConnector\Settings::init_settings');
    add_action('admin_menu', 'MobilizonConnector\Settings::register_settings_page');
  }

  public static function init_settings() {
    register_setting(
      self::$OPTIONS_GROUP_NAME,
      self::$OPTION_NAME_IS_SHORT_OFFSET_NAME_SHOWN
    );
    register_setting(
      self::$OPTIONS_GROUP_NAME,
      self::$OPTION_NAME_URL,
      'MobilizonConnector\Settings::validate_field_url'
    );

    add_settings_section(
      self::$SETTINGS_SECTION_NAME,
      __('General Settings', 'connector-mobilizon'),
      '',
      self::$PAGE_NAME
    );

    add_settings_field(
      self::$SETTING_FIELD_NAME_URL,
      __('URL', 'connector-mobilizon'),
      'MobilizonConnector\Settings::output_field_url',
      self::$PAGE_NAME,
      self::$SETTINGS_SECTION_NAME,
      array(
        'label_for' => self::$SETTING_FIELD_NAME_URL
      )
    );
    add_settings_field(
      self::$SETTING_FIELD_NAME_IS_SHORT_OFFSET_NAME_SHOWN,
      __('Display named offset', 'connector-mobilizon'),
      'MobilizonConnector\Settings::output_field_is_short_offset_name_shown',
      self::$PAGE_NAME,
      self::$SETTINGS_SECTION_NAME,
      array(
        'label_for' => self::$SETTING_FIELD_NAME_IS_SHORT_OFFSET_NAME_SHOWN
      )
    );
  }

  public static function output_field_is_short_offset_name_shown($args) {
    $isShortOffsetNameShown = self::isShortOffsetNameShown();
    require dirname(__DIR__) . '/view/settings/is-short-offset-name-shown-field.php';
  }

  public static function output_field_url($args) {
    $url = self::getUrl();
    require dirname(__DIR__) . '/view/settings/url-field.php';
  }

  public static function validate_field_url($input) {
    $validated = esc_url_raw($input);
    if ($validated !== $input) {
      add_settings_error(
        self::$OPTION_NAME_URL,
        'wordpress_mobilizon_field_url_error',
        __('The URL is invalid.', 'connector-mobilizon'),
        'error'
      );
    }
    if(substr($validated, -1) == '/') {
      $validated = substr($validated, 0, strlen($validated) - 1);
    }
    return $validated;
  }

  public static function register_settings_page() {
    add_options_page(
      NICE_NAME . ' ' . __('Settings', 'connector-mobilizon'),
      NICE_NAME,
      'manage_options',
      NAME . '-settings',
      'MobilizonConnector\Settings::output_settings_page'
    );
  }

  public static function output_settings_page() {
    if (!current_user_can('manage_options')) {
      return;
    }
    require dirname(__DIR__) . '/view/settings/page.php';
  }

  public static function isShortOffsetNameShown() {
    return get_option(self::$OPTION_NAME_IS_SHORT_OFFSET_NAME_SHOWN);
  }

  public static function getUrl() {
    return get_option(self::$OPTION_NAME_URL);
  }

  public static function setDefaultOptions() {
    add_option(self::$OPTION_NAME_IS_SHORT_OFFSET_NAME_SHOWN, self::$DEFAULT_IS_SHORT_OFFSET_NAME_SHOWN);
    add_option(self::$OPTION_NAME_URL, self::$DEFAULT_OPTION_URL);
  }

  public static function deleteAllOptions() {
    delete_option(self::$OPTION_NAME_IS_SHORT_OFFSET_NAME_SHOWN);
    delete_option(self::$OPTION_NAME_URL);
  }

}