<?php
/**
 * 注文画面（管理）への請求書出力ボタンと、その安全な受信ハンドラ。
 *
 * セキュリティ要件:
 * - capability チェック（注文編集権限）
 * - nonce チェック
 * - 注文の存在チェック
 * - PDF はサーバー保存しない動的生成
 *
 * @package Neutrope_Japanese_Invoice_PDFs_For_WooCommerce
 */

defined( 'ABSPATH' ) || exit;

/**
 * Class WCJBP_Order
 */
class WCJBP_Order {

	const ACTION     = 'wcjbp_admin_invoice';
	const NONCE      = 'wcjbp_admin_invoice';
	const CAPABILITY = 'edit_shop_orders';

	/**
	 * フック登録。
	 */
	public function init() {
		add_action( 'add_meta_boxes', array( $this, 'add_meta_box' ), 30 );
		add_action( 'admin_post_' . self::ACTION, array( $this, 'handle_request' ) );
	}

	/**
	 * 注文編集画面にメタボックスを追加する（HPOS / 旧形式の両対応）。
	 */
	public function add_meta_box() {
		$screens = array( 'shop_order' );

		if ( function_exists( 'wc_get_page_screen_id' ) ) {
			$hpos_screen = wc_get_page_screen_id( 'shop-order' );
			if ( $hpos_screen ) {
				$screens[] = $hpos_screen;
			}
		}

		foreach ( array_unique( $screens ) as $screen ) {
			add_meta_box(
				'wcjbp_invoice_box',
				__( 'Japanese Invoice PDFs', 'neutrope-japanese-invoice-pdfs-for-woocommerce' ),
				array( $this, 'render_meta_box' ),
				$screen,
				'side',
				'default'
			);
		}
	}

	/**
	 * メタボックスの中身（出力ボタン）。
	 *
	 * @param WP_Post|WC_Order $post_or_order 投稿または注文オブジェクト。
	 */
	public function render_meta_box( $post_or_order ) {
		$order = ( $post_or_order instanceof WC_Order )
			? $post_or_order
			: wc_get_order( is_object( $post_or_order ) ? $post_or_order->ID : 0 );

		if ( ! $order ) {
			echo '<p>' . esc_html__( '注文が見つかりません。', 'neutrope-japanese-invoice-pdfs-for-woocommerce' ) . '</p>';
			return;
		}

		$types = WCJBP_Pro_Gate::document_types();

		echo '<p>' . esc_html__( '帳票をPDFで出力します。', 'neutrope-japanese-invoice-pdfs-for-woocommerce' ) . '</p>';

		foreach ( $types as $type => $label ) {
			$url = wp_nonce_url(
				admin_url(
					sprintf(
						'admin-post.php?action=%s&order_id=%d&doc=%s',
						self::ACTION,
						$order->get_id(),
						rawurlencode( $type )
					)
				),
				self::NONCE
			);

			printf(
				'<a href="%1$s" class="button button-primary" target="_blank" rel="noopener" style="margin-bottom:6px;display:block;text-align:center;">%2$s</a>',
				esc_url( $url ),
				/* translators: %s: 帳票名（請求書など）。 */
				esc_html( sprintf( __( '%s を出力', 'neutrope-japanese-invoice-pdfs-for-woocommerce' ), $label ) )
			);
		}

		if ( ! wcjbp_is_pro() ) {
			echo '<p class="description">'
				. esc_html__( '領収書・銀行振込情報などはPro版で解放されます。', 'neutrope-japanese-invoice-pdfs-for-woocommerce' )
				. '</p>';
		}
	}

	/**
	 * 出力リクエストの受信・検証・委譲。
	 */
	public function handle_request() {
		// 1) 権限チェック。
		if ( ! current_user_can( self::CAPABILITY ) && ! current_user_can( 'manage_woocommerce' ) ) {
			wp_die(
				esc_html__( 'この操作を行う権限がありません。', 'neutrope-japanese-invoice-pdfs-for-woocommerce' ),
				'',
				array( 'response' => 403 )
			);
		}

		// 2) nonce チェック。
		$nonce = isset( $_REQUEST['_wpnonce'] )
			? sanitize_text_field( wp_unslash( $_REQUEST['_wpnonce'] ) )
			: '';
		if ( ! wp_verify_nonce( $nonce, self::NONCE ) ) {
			wp_die(
				esc_html__( 'セキュリティチェックに失敗しました。', 'neutrope-japanese-invoice-pdfs-for-woocommerce' ),
				'',
				array( 'response' => 403 )
			);
		}

		// 3) 注文の取得・存在チェック。
		$order_id = isset( $_GET['order_id'] ) ? absint( $_GET['order_id'] ) : 0;
		$order    = $order_id ? wc_get_order( $order_id ) : false;
		if ( ! $order instanceof WC_Order ) {
			wp_die(
				esc_html__( '注文が見つかりません。', 'neutrope-japanese-invoice-pdfs-for-woocommerce' ),
				'',
				array( 'response' => 404 )
			);
		}

		// 4) 帳票タイプの検証（無料版は invoice のみ）。
		$type = isset( $_GET['doc'] )
			? sanitize_key( wp_unslash( $_GET['doc'] ) )
			: 'invoice';
		if ( ! WCJBP_Pro_Gate::can_generate( $type ) ) {
			wp_die(
				esc_html__( 'この帳票タイプは利用できません。', 'neutrope-japanese-invoice-pdfs-for-woocommerce' ),
				'',
				array( 'response' => 403 )
			);
		}

		// 5) 動的生成してストリーミング（内部で exit）。
		WCJBP_PDF::stream( $order, $type, 'inline' );
	}
}
