<?php
/**
 * マイアカウントからの請求書ダウンロード（制限あり）。
 *
 * - 設定の ON/OFF（enable_myaccount_download）で有効化。
 * - 無料版は「請求書」のみ。
 * - セキュリティ: ログイン必須 + nonce + 注文所有者の二重チェック。
 *
 * @package Neutrope_Japanese_Invoice_PDFs_For_WooCommerce
 */

defined( 'ABSPATH' ) || exit;

/**
 * Class WCJBP_MyAccount
 */
class WCJBP_MyAccount {

	const QUERY_VAR = 'wcjbp_invoice';
	const NONCE_KEY = 'wcjbp_myaccount_invoice_';

	/**
	 * フック登録。
	 */
	public function init() {
		add_filter(
			'woocommerce_my_account_my_orders_actions',
			array( $this, 'add_order_action' ),
			10,
			2
		);
		add_action( 'template_redirect', array( $this, 'maybe_handle_request' ) );
	}

	/**
	 * 機能が有効か（設定 ON/OFF）。
	 *
	 * @return bool
	 */
	protected function is_enabled() {
		return 'yes' === wcjbp_get_setting( 'enable_myaccount_download', 'yes' );
	}

	/**
	 * マイアカウントの注文一覧に請求書ボタンを追加する。
	 *
	 * @param array    $actions アクション配列。
	 * @param WC_Order $order   注文。
	 * @return array
	 */
	public function add_order_action( $actions, $order ) {
		if ( ! $this->is_enabled() || ! $order instanceof WC_Order ) {
			return $actions;
		}

		// 念のため所有者のみに表示。
		if ( (int) $order->get_customer_id() !== get_current_user_id() ) {
			return $actions;
		}

		$url = wp_nonce_url(
			add_query_arg(
				array(
					self::QUERY_VAR => $order->get_id(),
					'doc'           => 'invoice',
				),
				wc_get_account_endpoint_url( 'orders' )
			),
			self::NONCE_KEY . $order->get_id()
		);

		$actions['wcjbp_invoice'] = array(
			'url'  => $url,
			'name' => __( '請求書', 'neutrope-japanese-invoice-pdfs-for-woocommerce' ),
		);

		return $actions;
	}

	/**
	 * フロントからのダウンロードリクエストを検証して処理する。
	 */
	public function maybe_handle_request() {
		if ( ! isset( $_GET[ self::QUERY_VAR ] ) ) {
			return;
		}

		// 1) 機能が無効なら 404 相当。
		if ( ! $this->is_enabled() ) {
			wp_die(
				esc_html__( 'この機能は現在無効です。', 'neutrope-japanese-invoice-pdfs-for-woocommerce' ),
				'',
				array( 'response' => 403 )
			);
		}

		// 2) ログイン必須。
		if ( ! is_user_logged_in() ) {
			wp_die(
				esc_html__( 'ログインが必要です。', 'neutrope-japanese-invoice-pdfs-for-woocommerce' ),
				'',
				array( 'response' => 401 )
			);
		}

		$order_id = absint( $_GET[ self::QUERY_VAR ] );

		// 3) nonce チェック（注文IDに紐づく）。
		$nonce = isset( $_GET['_wpnonce'] )
			? sanitize_text_field( wp_unslash( $_GET['_wpnonce'] ) )
			: '';
		if ( ! wp_verify_nonce( $nonce, self::NONCE_KEY . $order_id ) ) {
			wp_die(
				esc_html__( 'セキュリティチェックに失敗しました。', 'neutrope-japanese-invoice-pdfs-for-woocommerce' ),
				'',
				array( 'response' => 403 )
			);
		}

		// 4) 注文の存在チェック。
		$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 )
			);
		}

		// 5) 所有者チェック（二重防御）。
		$is_owner = ( (int) $order->get_customer_id() === get_current_user_id() );
		if ( ! $is_owner || ! current_user_can( 'view_order', $order_id ) ) {
			wp_die(
				esc_html__( 'この注文の請求書をダウンロードする権限がありません。', 'neutrope-japanese-invoice-pdfs-for-woocommerce' ),
				'',
				array( 'response' => 403 )
			);
		}

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

		// 7) 動的生成してダウンロード（内部で exit）。
		WCJBP_PDF::stream( $order, 'invoice', 'attachment' );
	}
}
