<?php

namespace Simplyin\Simplyin_W_Plugin\Admin;

if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly
}

use Simplyin\Simplyin_W_Plugin\Lib\Remote\Sin_Core_Api\Simplyin_Api_Legacy_Client;
use Simplyin\Simplyin_W_Plugin\Sync\Simplyin_Sync;

class SimplyIn_Admin {

	private string $plugin_name;
	private string $version;
	private Shipping_Mapping_Options $shipping_mapping_options;


	public function __construct( string $plugin_name, string $version ) {

		$this->plugin_name = $plugin_name;
		$this->version     = $version;
		add_action( 'admin_menu', [ $this, 'addPluginAdminMenu' ], 9 );
		add_action( 'admin_init', [ $this, 'registerAndBuildFields' ] );
		add_action(
			'admin_enqueue_scripts',
			[ $this, 'enqueue_admin_styles' ]
		);

		( new Shipping_Mapping_Migration() )->init();
	}

	public function enqueue_admin_styles(): void {
		wp_enqueue_script(
			$this->plugin_name,
			plugin_dir_url( __FILE__ ) . '../../admin/js/simplyin-admin.js',
			[ 'jquery' ],
			wp_rand(),
			false
		);
	}

	public function addPluginAdminMenu(): void {
		add_menu_page(
			$this->plugin_name,
			'Simply.IN',
			'manage_options',
			$this->plugin_name . '-settings',
			[ $this, 'displayPluginAdminSettings' ],
			'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEiIGhlaWdodD0iMjAiIHZpZXdCb3g9IjAgMCAyMSAyMCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTAuMDkzODY5NSAxMi40MDA0QzAuMDkzODY5NSAxMC43NDM1IDEuNDM3MDIgOS40MDAzOSAzLjA5Mzg3IDkuNDAwMzlDNC43NTA3MiA5LjQwMDM5IDYuMDkzODcgMTAuNzQzNSA2LjA5Mzg3IDEyLjQwMDRWMTcuMDAwNEM2LjA5Mzg3IDE4LjY1NzIgNC43NTA3MiAyMC4wMDA0IDMuMDkzODcgMjAuMDAwNEMxLjQzNzAyIDIwLjAwMDQgMC4wOTM4Njk1IDE4LjY1NzIgMC4wOTM4Njk1IDE3LjAwMDRWMTIuNDAwNFoiIGZpbGw9ImJsYWNrIi8+CjxwYXRoIGQ9Ik0xNC4wOTM5IDNDMTQuMDkzOSAxLjM0MzE1IDE1LjQzNyAwIDE3LjA5MzkgMEMxOC43NTA3IDAgMjAuMDkzOSAxLjM0MzE1IDIwLjA5MzkgM1YxN0MyMC4wOTM5IDE4LjY1NjkgMTguNzUwNyAyMCAxNy4wOTM5IDIwQzE1LjQzNyAyMCAxNC4wOTM5IDE4LjY1NjkgMTQuMDkzOSAxN1YzWiIgZmlsbD0iYmxhY2siLz4KPHBhdGggZD0iTTAuODkyMTM0IDUuMTcwMzdDLTAuMjg2ODIyIDQuMDA2MjMgLTAuMjk4ODMyIDIuMTA2NzcgMC44NjUzMTEgMC45Mjc4MTFDMi4wMjk0NSAtMC4yNTExNDUgMy45Mjg5MSAtMC4yNjMxNTMgNS4xMDc4NyAwLjkwMDk5TDE5LjIzMTYgMTQuODQ3MkMyMC40MTA1IDE2LjAxMTQgMjAuNDIyNSAxNy45MTA4IDE5LjI1ODQgMTkuMDg5OEMxOC4wOTQyIDIwLjI2ODcgMTYuMTk0OCAyMC4yODA3IDE1LjAxNTggMTkuMTE2NkwwLjg5MjEzNCA1LjE3MDM3WiIgZmlsbD0iYmxhY2siLz4KPHBhdGggZD0iTTMuMDE2MTIgNC44MTEzQzIuNDc5MTIgNC44MTEzIDIuMDMwMTIgNC42MzAzIDEuNjY4MTIgNC4yNjgzQzEuMzA2MTIgMy45MDYzIDEuMTI1MTIgMy40NTczIDEuMTI1MTIgMi45MjAzQzEuMTI1MTIgMi4zODMzIDEuMzA2MTIgMS45MzQzIDEuNjY4MTIgMS41NzIzQzIuMDMwMTIgMS4yMTAzIDIuNDc5MTIgMS4wMjkzIDMuMDE2MTIgMS4wMjkzQzMuNTY1MTIgMS4wMjkzIDQuMDE0MTIgMS4yMTAzIDQuMzY0MTIgMS41NzIzQzQuNzI2MTIgMS45MzQzIDQuOTA3MTIgMi4zODMzIDQuOTA3MTIgMi45MjAzQzQuOTA3MTIgMy40NTczIDQuNzI2MTIgMy45MDYzIDQuMzY0MTIgNC4yNjgzQzQuMDE0MTIgNC42MzAzIDMuNTY1MTIgNC44MTEzIDMuMDE2MTIgNC44MTEzWiIgZmlsbD0id2hpdGUiLz4KPC9zdmc+Cg==',
			26
		);
	}


	public function displayPluginAdminDashboard() {
		require_once plugin_dir_path( __DIR__ ) . 'admin/partials/' . $this->plugin_name . '-admin-display.php';
	}

	public function displayPluginAdminSettings() {
		$msg_err = get_option( 'SimplyInSettingsErrorMsg' );
		if ( is_string( $msg_err ) && ! is_numeric( $msg_err ) ) {
			simplyin()->update_option(
				'SimplyInSettingsErrorMsg',
				0
			);

			add_settings_error(
				'simplyin_api_key',
				'',
				$msg_err,
				'error'
			);
		}

		$msg_success = get_option( 'SimplyInSettingsSuccessMsg' );

		if ( is_string( $msg_success ) && ! is_numeric( $msg_success ) ) {
			simplyin()->update_option(
				'SimplyInSettingsSuccessMsg',
				0
			);

			add_settings_error(
				'simplyin_api_key',
				'',
				$msg_success,
				'success'
			);
		}

		require_once 'partials/' . $this->plugin_name . '-admin-settings-display.php';
	}

	public function simplyinSettingsMessages( $error_message ) {
		switch ( $error_message ) {
			case '1':
				$message       = __(
					'There was an error adding this setting. Please try again.  If this persists, shoot us an email.',
					'simplyin'
				);
				$err_code      = esc_attr( 'plugin_name_example_setting' );
				$setting_field = 'plugin_name_example_setting';
				break;
		}
		$type = 'error';
		add_settings_error(
			$setting_field,
			$err_code,
			$message,
			$type
		);
	}

	private function init_shipping_mapping() {
		$this->shipping_mapping_options = new Shipping_Mapping_Options();
	}


	public function registerAndBuildFields() {
		$this->init_shipping_mapping();

		add_settings_section(
			'simplyin_settings_page_general_section',
			esc_html( __( 'API Key', 'simplyin' ) ),
			[ $this, 'settings_page_display_general_account' ],
			'simply_settings_main'
		);

		// Simply.IN API Key field
		add_settings_field(
			'simplyin_api_key',
			'Simply.IN API Key',
			[ $this, 'settings_page_render_settings_field' ],
			'simply_settings_main',
			'simplyin_settings_page_general_section',
			[
				'type'       => 'input',
				'subtype'    => 'password',
				'id'         => 'simplyin_api_key',
				'name'       => 'simplyin_api_key',
				'required'   => 'true',
				'value_type' => 'normal',
				'wp_data'    => 'option',
			]
		);

		$disabled = get_option( 'SimplyInRegisterByDefaultDisabled' );
		// Register by Default checkbox field  - show only when option disabled is not set

		if ( empty( $disabled ) ) {
			add_settings_section(
				'simplyin_settings_page_additional_section',
				__( 'Additional Settings', 'simplyin' ),
				'__return_false',
				'simply_settings_main'
			);

			add_settings_field(
				'simplyin_register_by_default',
				'Register by Default',
				[ $this, 'settings_page_render_settings_field' ],
				'simply_settings_main',
				'simplyin_settings_page_additional_section',
				[
					'type'       => 'input',
					'subtype'    => 'checkbox',
					'id'         => 'simplyin_register_by_default',
					'name'       => 'simplyin_register_by_default',
					'value_type' => 'normal',
					'wp_data'    => 'option',
				]
			);

			// Register settings
			register_setting(
				'simply_settings_main',
				'simplyin_register_by_default',
				[
					'type'              => 'string',
					// Toggle is visually inverted: checked = do NOT pre-check in cart (store 'off'), unchecked = pre-check in cart (store 'on')
					'sanitize_callback' => function ( $value ) {
						return $value ? 'on' : 'off';
					},
				]
			);
		}

		// Simply.IN API Key field
		add_settings_field(
			'simplyin_shipping_mapping',
			'Shipping mapping',
			[ $this, 'settings_page_render_settings_field' ],
			'simply_settings_main',
			'simplyin_settings_page_general_section',
			[
				'type'           => 'shipping_mapping',
				'subtype'        => 'text',
				'id'             => 'simplyin_shipping_mapping',
				'name'           => 'simplyin_shipping_mapping',
				'required'       => 'true',
				'value_type'     => 'normal',
				'wp_data'        => 'option',
				'mapping_config' => $this->get_shipping_mapping_options(),
			]
		);

		$this->shipping_mapping_options->register_settings();

		// Register settings
		register_setting(
			'simply_settings_main',
			'simplyin_api_key',
			[
				'type'              => 'string',
				'sanitize_callback' => 'sanitize_text_field',
			]
		);
	}

	public function settings_page_display_general_account() {
		printf(
			'<p>%s</p>',
			sprintf(
			/* translators: 1: Simply.IN link open tag, 2: Simply.IN link close tag, 3: Merchant Panel link open tag, 4: Merchant Panel link close tag */
				esc_html__(
					'To activate %1$sSimply.IN%2$s in your store, paste below the API key generated in the %3$smerchant panel%4$s. Detailed instructions are available in the panel.',
					'simplyin'
				),
				'<a href="https://www.simply.in" target="_blank">',
				// %1$s
				'</a>',
				// %2$s
				'<a href="https://merchant.simply.in" target="_blank">',
				// %3$s
				'</a>'                                                      // %4$s
			)
		);
	}

	public $allowed_tags = [
		'form',
		'label',
		'input',
		'textarea',
		'iframe',
		'script',
		'style',
		'strong',
		'small',
		'table',
		'span',
		'abbr',
		'code',
		'pre',
		'div',
		'img',
		'h1',
		'h2',
		'h3',
		'h4',
		'h5',
		'h6',
		'ol',
		'ul',
		'li',
		'em',
		'hr',
		'br',
		'tr',
		'td',
		'p',
		'a',
		'b',
		'i',
	];
	public $allowed_atts = [
		'align',
		'class',
		'type',
		'id',
		'dir',
		'lang',
		'style',
		'xml:lang',
		'src',
		'alt',
		'href',
		'rel',
		'rev',
		'target',
		'novalidate',
		'value',
		'name',
		'tabindex',
		'action',
		'method',
		'for',
		'width',
		'height',
		'data',
		'title',
	];


	public function settings_page_render_settings_field( $args ) {

		if ( $args['wp_data'] == 'option' ) {
			$wp_data_value = get_option( $args['name'] );
		} elseif ( $args['wp_data'] == 'post_meta' ) {
			$wp_data_value = get_post_meta(
				$args['post_id'],
				$args['name'],
				true
			);
		}

		$local_allowed_tags = [];
		foreach ( $this->allowed_tags as $tag ) {
			$local_allowed_tags[ $tag ] = array_combine(
				$this->allowed_atts,
				array_fill( 0, count( $this->allowed_atts ), true )
			);
		}

		switch ( $args['type'] ) {
			case 'input':
				$value = ( $args['value_type'] == 'serialized' ) ? serialize( $wp_data_value ) : $wp_data_value;
				if ( $args['subtype'] != 'checkbox' ) {
					// Render input fields
					$prependStart  = ( isset( $args['prepend_value'] ) ) ? '<div class="input-prepend"> <span class="add-on">' . $args['prepend_value'] . '</span>' : '';
					$prependEnd    = ( isset( $args['prepend_value'] ) ) ? '</div>' : '';
					$step          = ( isset( $args['step'] ) ) ? 'step="' . $args['step'] . '"' : '';
					$min           = ( isset( $args['min'] ) ) ? 'min="' . $args['min'] . '"' : '';
					$max           = ( isset( $args['max'] ) ) ? 'max="' . $args['max'] . '"' : '';
					$disabled_attr = ( isset( $args['disabled'] ) ) ? 'disabled' : '';
					$required_attr = ( isset( $args['required'] ) && $args['required'] == 'true' ) ? 'required' : '';

					echo wp_kses(
						$prependStart . '<input type="' . $args['subtype'] . '" id="' . $args['id'] . '" ' . $required_attr . ' ' . $step . ' ' . $max . ' ' . $min . ' name="' . $args['name'] . '" size="40" value="' . esc_attr( $value ) . '" ' . $disabled_attr . ' />' . $prependEnd,
						$local_allowed_tags
					);

				} else {
					// 'off' or '' = cart not pre-checked → show as checked
					// false = fresh install → show as unchecked
					// 'on' / '1' = cart pre-checked → show as unchecked
					$is_checked = ( $wp_data_value === 'off' || $wp_data_value === '' ) ? 'checked="checked"' : '';
					$brand_link = sprintf(
						'<a href="https://www.simply.in" target="_blank">%s</a>',
						esc_html__( 'Simply.IN', 'simplyin' )
					);

					$allowed_tags_brand_link = [
						'a' => [
							'href'   => true,
							'rel'    => true,
							'target' => true,
						],
					];

					printf(
						'<div class="registerByDefaultContainer">
                            <div>
                                <div class="row">
                                    <p>%s</p>
                                    <div>
                                        <input type="hidden" name="%s" value="1" />
                                        <input type="%s" id="%s" name="%s" value="0" %s />
                                    </div>
                                </div>
                            </div>
                        </div>',
						// Arg 1: description text
						esc_html__(
							'The "Remember your details with Simply.IN" checkbox is not selected by default for users who do not have an account at Simply.IN.',
							'simplyin'
						),
						// hidden input name
						esc_attr( $args['name'] ),
						// checkbox input attributes
						esc_attr( $args['subtype'] ),
						esc_attr( $args['id'] ),
						esc_attr( $args['name'] ),
						esc_html( $is_checked )
					);
				}
				break;

			case 'shipping_mapping':
				$this->shipping_mapping_options->render_fields( $args );

			default:
				break;
		}
	}

	public function get_shipping_mapping_options(): Shipping_Mapping_Options {
		return $this->shipping_mapping_options;
	}
}
