<?php
/**
 * 管理画面：設定ページ（WooCommerce > Japanese Invoice PDFs）。
 *
 * WordPress Settings API を使用し、設定は 1 つの option
 * （wcjbp_settings）に集約する。
 *
 * @package Neutrope_Japanese_Invoice_PDFs_For_WooCommerce
 */

defined( 'ABSPATH' ) || exit;

/**
 * Class WCJBP_Admin
 */
class WCJBP_Admin {

	const OPTION_NAME = 'wcjbp_settings';
	const PAGE_SLUG   = 'wcjbp-settings';
	const CAPABILITY  = 'manage_woocommerce';

	/**
	 * フック登録。
	 */
	public function init() {
		add_action( 'admin_menu', array( $this, 'add_menu' ) );
		add_action( 'admin_init', array( $this, 'register_settings' ) );
		add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_assets' ) );
		add_filter(
			'plugin_action_links_' . WCJBP_PLUGIN_BASENAME,
			array( $this, 'action_links' )
		);
	}

	/**
	 * WooCommerce メニュー配下にサブメニューを追加する。
	 */
	public function add_menu() {
		add_submenu_page(
			'woocommerce',
			__( 'Japanese Invoice PDFs', 'neutrope-japanese-invoice-pdfs-for-woocommerce' ),
			__( 'Japanese Invoice PDFs', 'neutrope-japanese-invoice-pdfs-for-woocommerce' ),
			self::CAPABILITY,
			self::PAGE_SLUG,
			array( $this, 'render_page' )
		);
	}

	/**
	 * 設定リンクをプラグイン一覧に追加する。
	 *
	 * @param array $links 既存リンク。
	 * @return array
	 */
	public function action_links( $links ) {
		$url      = admin_url( 'admin.php?page=' . self::PAGE_SLUG );
		$settings = '<a href="' . esc_url( $url ) . '">'
			. esc_html__( '設定', 'neutrope-japanese-invoice-pdfs-for-woocommerce' ) . '</a>';
		array_unshift( $links, $settings );
		return $links;
	}

	/**
	 * 設定項目を登録する。
	 */
	public function register_settings() {
		register_setting(
			'wcjbp_settings_group',
			self::OPTION_NAME,
			array(
				'type'              => 'array',
				'sanitize_callback' => array( $this, 'sanitize' ),
				'default'           => wcjbp_default_settings(),
			)
		);

		add_settings_section(
			'wcjbp_section_company',
			__( '会社情報', 'neutrope-japanese-invoice-pdfs-for-woocommerce' ),
			'__return_false',
			self::PAGE_SLUG
		);

		add_settings_field(
			'company_name',
			__( '会社名', 'neutrope-japanese-invoice-pdfs-for-woocommerce' ),
			array( $this, 'field_text' ),
			self::PAGE_SLUG,
			'wcjbp_section_company',
			array( 'key' => 'company_name' )
		);

		add_settings_field(
			'company_address',
			__( '住所', 'neutrope-japanese-invoice-pdfs-for-woocommerce' ),
			array( $this, 'field_textarea' ),
			self::PAGE_SLUG,
			'wcjbp_section_company',
			array( 'key' => 'company_address' )
		);

		add_settings_field(
			'logo_attachment_id',
			__( 'ロゴ', 'neutrope-japanese-invoice-pdfs-for-woocommerce' ),
			array( $this, 'field_logo' ),
			self::PAGE_SLUG,
			'wcjbp_section_company',
			array( 'key' => 'logo_attachment_id' )
		);

		add_settings_section(
			'wcjbp_section_myaccount',
			__( 'マイアカウント', 'neutrope-japanese-invoice-pdfs-for-woocommerce' ),
			'__return_false',
			self::PAGE_SLUG
		);

		add_settings_field(
			'enable_myaccount_download',
			__( 'マイアカウントからの請求書ダウンロード', 'neutrope-japanese-invoice-pdfs-for-woocommerce' ),
			array( $this, 'field_checkbox' ),
			self::PAGE_SLUG,
			'wcjbp_section_myaccount',
			array(
				'key'   => 'enable_myaccount_download',
				'label' => __( '顧客が自分の注文の請求書PDFをダウンロードできるようにする', 'neutrope-japanese-invoice-pdfs-for-woocommerce' ),
			)
		);
	}

	/**
	 * 入力値のサニタイズ。
	 *
	 * @param mixed $input 送信値。
	 * @return array<string,mixed>
	 */
	public function sanitize( $input ) {
		$input  = is_array( $input ) ? $input : array();
		$output = wcjbp_default_settings();

		$output['company_name']              = isset( $input['company_name'] )
			? sanitize_text_field( wp_unslash( $input['company_name'] ) )
			: '';
		$output['company_address']           = isset( $input['company_address'] )
			? sanitize_textarea_field( wp_unslash( $input['company_address'] ) )
			: '';
		$output['logo_attachment_id']        = isset( $input['logo_attachment_id'] )
			? absint( $input['logo_attachment_id'] )
			: 0;
		$output['enable_myaccount_download'] =
			( isset( $input['enable_myaccount_download'] ) && 'yes' === $input['enable_myaccount_download'] )
				? 'yes'
				: 'no';

		return $output;
	}

	/**
	 * テキスト入力フィールド。
	 *
	 * @param array $args フィールド引数。
	 */
	public function field_text( $args ) {
		$key   = $args['key'];
		$value = wcjbp_get_setting( $key );
		printf(
			'<input type="text" class="regular-text" name="%1$s[%2$s]" value="%3$s" />',
			esc_attr( self::OPTION_NAME ),
			esc_attr( $key ),
			esc_attr( $value )
		);
	}

	/**
	 * テキストエリアフィールド。
	 *
	 * @param array $args フィールド引数。
	 */
	public function field_textarea( $args ) {
		$key   = $args['key'];
		$value = wcjbp_get_setting( $key );
		printf(
			'<textarea class="large-text" rows="4" name="%1$s[%2$s]">%3$s</textarea>',
			esc_attr( self::OPTION_NAME ),
			esc_attr( $key ),
			esc_textarea( $value )
		);
	}

	/**
	 * チェックボックスフィールド。
	 *
	 * @param array $args フィールド引数。
	 */
	public function field_checkbox( $args ) {
		$key     = $args['key'];
		$label   = isset( $args['label'] ) ? $args['label'] : '';
		$checked = ( 'yes' === wcjbp_get_setting( $key, 'no' ) );
		printf(
			'<label><input type="checkbox" name="%1$s[%2$s]" value="yes" %3$s /> %4$s</label>',
			esc_attr( self::OPTION_NAME ),
			esc_attr( $key ),
			checked( $checked, true, false ),
			esc_html( $label )
		);
	}

	/**
	 * ロゴ選択フィールド（メディアアップローダ）。
	 *
	 * @param array $args フィールド引数。
	 */
	public function field_logo( $args ) {
		$key           = $args['key'];
		$attachment_id = absint( wcjbp_get_setting( $key, 0 ) );
		$preview       = $attachment_id ? wp_get_attachment_image( $attachment_id, 'medium' ) : '';
		?>
		<div class="wcjbp-logo-control">
			<div class="wcjbp-logo-preview">
				<?php echo wp_kses_post( $preview ); ?>
			</div>
			<input type="hidden"
				id="wcjbp_logo_attachment_id"
				name="<?php echo esc_attr( self::OPTION_NAME . '[' . $key . ']' ); ?>"
				value="<?php echo esc_attr( $attachment_id ); ?>" />
			<button type="button" class="button" id="wcjbp_logo_select">
				<?php esc_html_e( 'ロゴを選択', 'neutrope-japanese-invoice-pdfs-for-woocommerce' ); ?>
			</button>
			<button type="button" class="button" id="wcjbp_logo_remove" <?php disabled( ! $attachment_id ); ?>>
				<?php esc_html_e( '削除', 'neutrope-japanese-invoice-pdfs-for-woocommerce' ); ?>
			</button>
			<p class="description">
				<?php esc_html_e( '請求書PDFのヘッダーに表示されます。', 'neutrope-japanese-invoice-pdfs-for-woocommerce' ); ?>
			</p>
		</div>
		<?php
	}

	/**
	 * 設定ページ専用のメディアアップローダ等を読み込む。
	 *
	 * @param string $hook 現在の管理画面フック。
	 */
	public function enqueue_assets( $hook ) {
		if ( 'woocommerce_page_' . self::PAGE_SLUG !== $hook ) {
			return;
		}

		wp_enqueue_media();

		$script = <<<'JS'
( function ( $ ) {
	$( function () {
		var frame;
		$( '#wcjbp_logo_select' ).on( 'click', function ( e ) {
			e.preventDefault();
			if ( frame ) { frame.open(); return; }
			frame = wp.media( {
				title: wcjbpLogo.title,
				button: { text: wcjbpLogo.button },
				library: { type: 'image' },
				multiple: false
			} );
			frame.on( 'select', function () {
				var att = frame.state().get( 'selection' ).first().toJSON();
				$( '#wcjbp_logo_attachment_id' ).val( att.id );
				var url = ( att.sizes && att.sizes.medium ) ? att.sizes.medium.url : att.url;
				$( '.wcjbp-logo-preview' ).html( '<img src="' + url + '" />' );
				$( '#wcjbp_logo_remove' ).prop( 'disabled', false );
			} );
			frame.open();
		} );
		$( '#wcjbp_logo_remove' ).on( 'click', function ( e ) {
			e.preventDefault();
			$( '#wcjbp_logo_attachment_id' ).val( '' );
			$( '.wcjbp-logo-preview' ).empty();
			$( this ).prop( 'disabled', true );
		} );
	} );
} )( jQuery );
JS;

		wp_register_script(
			'wcjbp-admin',
			'',
			array( 'jquery' ),
			WCJBP_VERSION,
			true
		);
		wp_enqueue_script( 'wcjbp-admin' );
		wp_localize_script(
			'wcjbp-admin',
			'wcjbpLogo',
			array(
				'title'  => __( 'ロゴを選択', 'neutrope-japanese-invoice-pdfs-for-woocommerce' ),
				'button' => __( 'このロゴを使用', 'neutrope-japanese-invoice-pdfs-for-woocommerce' ),
			)
		);
		wp_add_inline_script( 'wcjbp-admin', $script );
	}

	/**
	 * 設定ページの描画。
	 */
	public function render_page() {
		if ( ! current_user_can( self::CAPABILITY ) ) {
			wp_die(
				esc_html__( 'この設定にアクセスする権限がありません。', 'neutrope-japanese-invoice-pdfs-for-woocommerce' )
			);
		}
		?>
		<div class="wrap">
			<h1><?php esc_html_e( 'Neutrope Japanese Invoice PDFs for WooCommerce', 'neutrope-japanese-invoice-pdfs-for-woocommerce' ); ?></h1>

			<?php if ( ! wcjbp_is_pro() ) : ?>
				<div class="notice notice-info inline">
					<p>
						<?php
						esc_html_e(
							'無料版をご利用中です。適格請求書番号・税率別表示・領収書・銀行振込情報・支払期限・会社印などはPro版で解放されます。',
							'neutrope-japanese-invoice-pdfs-for-woocommerce'
						);
						?>
					</p>
				</div>
			<?php endif; ?>

			<form method="post" action="options.php">
				<?php
				settings_fields( 'wcjbp_settings_group' );
				do_settings_sections( self::PAGE_SLUG );
				submit_button();
				?>
			</form>
		</div>
		<?php
	}
}
