<?php

namespace WPDesk\FCF\Free\Settings;

use FcfVendor\WPDesk\PluginBuilder\Plugin\Hookable;
use FcfVendor\WPDesk\PluginBuilder\Plugin\HookablePluginDependant;
use FcfVendor\WPDesk\PluginBuilder\Plugin\PluginAccess;
use FcfVendor\WPDesk\View\Renderer\SimplePhpRenderer;
use FcfVendor\WPDesk\View\Resolver\DirResolver;
use WPDesk\FCF\Free\Field\Types;
use WPDesk\FCF\Free\Settings\Route\RouteIntegration;

/**
 * Supports page of plugin settings.
 */
class Page implements Hookable, HookablePluginDependant {

	use PluginAccess;

	public const SETTINGS_PAGE = 'wpdesk_checkout_fields_settings';

	private const SCRIPT_HANDLE = 'fcf-admin';

	/**
	 * Class object for template rendering.
	 *
	 * @var SimplePhpRenderer
	 */
	private $renderer;

	/**
	 * Class constructor.
	 */
	public function __construct() {
		$this->set_renderer();
	}

	/**
	 * Init class for template rendering.
	 */
	private function set_renderer() {
		$this->renderer = new SimplePhpRenderer( new DirResolver( dirname( dirname( __DIR__ ) ) . '/templates' ) );
	}

	/**
	 * {@inheritdoc}
	 */
	public function hooks() {
		add_action( 'admin_menu', [ $this, 'add_settings_page' ], 80 );
		add_action( 'admin_enqueue_scripts', [ $this, 'load_assets_for_settings_page' ], 80 );
	}

	/**
	 * Registers admin page for plugin settings.
	 *
	 * @internal
	 */
	public function add_settings_page() {
		add_submenu_page(
			'woocommerce',
			__( 'Checkout Fields Settings', 'flexible-checkout-fields' ),
			__( 'Checkout Fields', 'flexible-checkout-fields' ),
			'manage_woocommerce',
			self::SETTINGS_PAGE,
			[ $this, 'render_settings_page' ]
		);
	}

	/**
	 * Initiates loading of assets needed to operate admin page.
	 *
	 * @internal
	 */
	public function load_assets_for_settings_page() {
		if ( ! isset( $_GET['page'] ) || ( $_GET['page'] !== self::SETTINGS_PAGE ) ) { // phpcs:ignore
			return;
		}

		add_filter( 'admin_footer_text', [ $this, 'update_footer_text' ] );
		$this->load_styles_for_page();
		$this->load_scripts_for_page();
	}

	/**
	 * Loads admin page template.
	 *
	 * @internal
	 */
	public function render_settings_page() {
		$menu_tabs     = ( new Menu() )->get_menu_tabs();
		$menu_sections = ( new Menu() )->get_menu_sections();

		echo $this->renderer->render( // phpcs:ignore
			'views/admin-page',
			[
				'settings'      => $this->load_settings_data( $menu_sections ), // phpcs:ignore
				'menu_tabs'     => $menu_tabs, // phpcs:ignore
				'menu_sections' => $menu_sections, // phpcs:ignore
			]
		);
	}

	/**
	 * Returns set of data needed to support admin panel by JS code.
	 *
	 * @param array $menu_sections Items of menu with sections.
	 *
	 * @return array Settings of admin page.
	 */
	private function load_settings_data( array $menu_sections ): array {
		$settings = [
			'rest_api_url'      => get_rest_url( null, RouteIntegration::REST_API_NAMESPACE ),
			'header_nonce'      => wp_create_nonce( 'wp_rest' ),
			'i18n'              => $this->load_translations(),
			'is_pro_compatible' => apply_filters( 'flexible_checkout_fields/is_pro_compatible', true ),
		];

		switch ( $_GET['tab'] ?? '' ) { // phpcs:ignore
			case MENU::MENU_TAB_SETTINGS:
				$settings['form_settings'] = [
					'api_route'     => 'settings',
					'form_index'    => null,
					'option_fields' => apply_filters( 'flexible_checkout_fields/form_fields_settings', [] ),
					'option_values' => apply_filters( 'flexible_checkout_fields/form_data_settings', [] ),
					'settings_tabs' => [],
				];
				break;
			default:
				$section = $this->get_active_section( $menu_sections );
				if ( ! $section ) {
					break;
				}

				$settings['form_fields'] = [
					'api_route'     => sprintf( '%s/fields', $section['id'] ),
					'form_index'    => $section['id'],
					'option_fields' => apply_filters( 'flexible_checkout_fields/field_types', [], $section['id'] ),
					'option_values' => array_values( apply_filters( 'flexible_checkout_fields/form_data_fields', [], $section['id'] ) ),
					'settings_tabs' => apply_filters( 'flexible_checkout_fields/field_settings_tabs', [] ),
					'field_group'   => [
						[
							'name'  => Types::FIELD_GROUP_TEXT,
							'label' => __( 'Text Fields', 'flexible-checkout-fields' ),
						],
						[
							'name'  => Types::FIELD_GROUP_OPTION,
							'label' => __( 'Option Fields', 'flexible-checkout-fields' ),
						],
						[
							'name'  => Types::FIELD_GROUP_PICKER,
							'label' => __( 'Picker Fields', 'flexible-checkout-fields' ),
						],
						[
							'name'  => Types::FIELD_GROUP_OTHER,
							'label' => __( 'Other Fields', 'flexible-checkout-fields' ),
						],
					],
				];

				if ( ! $section['has_section_form'] ) {
					break;
				}
				$settings['form_section'] = [
					'api_route'     => sprintf( '%s/section', $section['id'] ),
					'form_index'    => $section['id'],
					'option_fields' => apply_filters( 'flexible_checkout_fields/form_fields_section', [], $section['id'] ),
					'option_values' => apply_filters( 'flexible_checkout_fields/form_data_section', [], $section['id'] ),
					'settings_tabs' => [],
				];
				break;
		}

		/**
		 * Filter settings of admin page.
		 *
		 * @param array  $settings   Settings of admin page.
		 * @param array  $menu_items Items of menu with sections.
		 */
		$settings = apply_filters( 'flexible_checkout_fields/init_admin_settings', $settings, $menu_sections );

		return $settings;
	}

	/**
	 * Returns active section from sections menu.
	 *
	 * @param array $menu_sections Items of menu with sections.
	 *
	 * @return array|null Active item of menu.
	 */
	private function get_active_section( array $menu_sections ) {
		foreach ( $menu_sections as $section ) {
			if ( $section['is_active'] ) {
				return $section;
			}
		}
		return null;
	}

	/**
	 * Returns list of translations used by JS code.
	 *
	 * @return array Translations values.
	 */
	private function load_translations(): array {
		return [
			'form_fields'             => __( 'Edit form', 'flexible-checkout-fields' ),
			'form_add_field'          => __( 'Add new field', 'flexible-checkout-fields' ),
			'form_section'            => __( 'Edit section', 'flexible-checkout-fields' ),
			'form_settings'           => __( 'Edit settings', 'flexible-checkout-fields' ),
			'button_add_field'        => __( 'Add Field', 'flexible-checkout-fields' ),
			'button_add_row'          => __( 'Add New', 'flexible-checkout-fields' ),
			'button_save'             => __( 'Save Changes', 'flexible-checkout-fields' ),
			'button_reset'            => __( 'Reset Section Settings', 'flexible-checkout-fields' ),
			'button_read_more'        => __( 'Read more', 'flexible-checkout-fields' ),
			'button_yes'              => __( 'Yes', 'flexible-checkout-fields' ),
			'button_no'               => __( 'No', 'flexible-checkout-fields' ),
			'button_upload_image'     => __( 'Upload image', 'flexible-checkout-fields' ),
			'button_select_color'     => __( 'Select color', 'flexible-checkout-fields' ),
			'field_type'              => __( 'Field Type', 'flexible-checkout-fields' ),
			'field_label'             => __( 'Label', 'flexible-checkout-fields' ),
			'field_name'              => __( 'Name', 'flexible-checkout-fields' ),
			'validation_required'     => __( 'This field is required.', 'flexible-checkout-fields' ),
			'validation_max_length'   => __( 'This value is too long.', 'flexible-checkout-fields' ),
			'validation_slug'         => __( 'Field name should contains only lowercase letters, numbers and underscore sign.', 'flexible-checkout-fields' ),
			'select_placeholder'      => __( 'Select...', 'flexible-checkout-fields' ),
			'select_loading'          => __( 'Loading...', 'flexible-checkout-fields' ),
			'select_empty'            => __( 'No options.', 'flexible-checkout-fields' ),
			'alert_field_unavailable' => sprintf(
			/* translators: %1$s: break line, %2$s: anchor opening tag, %3$s: anchor closing tag */
				__( 'This field is available in the PRO version. %1$s %2$sUpgrade to PRO%3$s', 'flexible-checkout-fields' ),
				'<br>',
				'<a href="' . esc_url( apply_filters( 'flexible_checkout_fields/short_url', '#', 'fcf-settings-field-type-upgrade' ) ) . '" target="_blank" class="fcfArrowLink">',
				'</a>'
			),
			'alert_remove_field'      => __( 'Are you sure you want to delete this field? Deleting a field will remove it from all orders.', 'flexible-checkout-fields' ),
			'alert_reset'             => __( 'Do you really want to reset section settings? Resetting a section remove all added fields from orders.', 'flexible-checkout-fields' ),
			'alert_no_fields'         => __( 'No fields available.', 'flexible-checkout-fields' ),
			'alert_failed_save'       => __( 'Failed to connect to WordPress REST API.', 'flexible-checkout-fields' ),
		];
	}

	/**
	 * Removes WooCommerce footer from plugin settings page.
	 *
	 * @return string New footer content.
	 * @internal
	 */
	public function update_footer_text(): string {
		return '';
	}

	/**
	 * Enqueues styles in WordPress Admin Dashboard.
	 */
	private function load_styles_for_page() {
		$is_debug = ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG );

		wp_register_style(
			self::SCRIPT_HANDLE,
			\trailingslashit( $this->plugin->get_plugin_assets_url() ) . 'css/new-admin.css',
			[],
			( $is_debug ) ? time() : $this->plugin->get_script_version()
		);
		wp_enqueue_style( self::SCRIPT_HANDLE );
	}

	/**
	 * Enqueues scripts in WordPress Admin Dashboard.
	 */
	private function load_scripts_for_page() {
		$is_debug = ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG );

		wp_register_script(
			self::SCRIPT_HANDLE,
			\trailingslashit( $this->plugin->get_plugin_assets_url() ) . 'js/new-admin.js',
			[ 'wp-i18n' ],
			( $is_debug ) ? time() : $this->plugin->get_script_version(),
			true
		);
		wp_enqueue_media();
		wp_enqueue_script( self::SCRIPT_HANDLE );

		$plugin_dir = \trailingslashit( WP_PLUGIN_DIR ) . $this->plugin->get_plugin_file_path();
		wp_set_script_translations( self::SCRIPT_HANDLE, 'flexible-checkout-fields', \plugin_dir_path( $plugin_dir ) . 'lang' );
	}
}
