<?php
/**
 * 共通ヘルパー関数。
 *
 * すべて `wcjbp_` プレフィックスで衝突を回避する。
 *
 * @package Neutrope_Japanese_Invoice_PDFs_For_WooCommerce
 */

defined( 'ABSPATH' ) || exit;

/**
 * Pro版が有効かどうか（ショートカット）。
 *
 * @return bool
 */
function wcjbp_is_pro() {
	return WCJBP_Pro_Gate::is_pro();
}

/**
 * 設定のデフォルト値。
 *
 * @return array<string,mixed>
 */
function wcjbp_default_settings() {
	return array(
		'company_name'              => '',
		'company_address'           => '',
		'logo_attachment_id'        => 0,
		'enable_myaccount_download' => 'yes',
	);
}

/**
 * 保存済み設定を取得する（デフォルトとマージ）。
 *
 * @return array<string,mixed>
 */
function wcjbp_get_settings() {
	$saved = get_option( 'wcjbp_settings', array() );
	if ( ! is_array( $saved ) ) {
		$saved = array();
	}
	return wp_parse_args( $saved, wcjbp_default_settings() );
}

/**
 * 設定値を1件取得する。
 *
 * @param string $key      設定キー。
 * @param mixed  $fallback キーが無い場合の既定値。
 * @return mixed
 */
function wcjbp_get_setting( $key, $fallback = '' ) {
	$settings = wcjbp_get_settings();
	return isset( $settings[ $key ] ) ? $settings[ $key ] : $fallback;
}

/**
 * ロゴ画像のローカル絶対パスを取得する。
 *
 * mPDF はリモートURLよりローカルパスの方が安定かつ安全に読み込める。
 *
 * @return string ファイルパス。未設定/不正時は空文字。
 */
function wcjbp_get_logo_path() {
	$attachment_id = absint( wcjbp_get_setting( 'logo_attachment_id', 0 ) );
	if ( ! $attachment_id ) {
		return '';
	}

	$path = get_attached_file( $attachment_id );
	if ( ! $path || ! is_readable( $path ) ) {
		return '';
	}

	return $path;
}

/**
 * テンプレートを読み込んで HTML 文字列を返す。
 *
 * テーマ側 `yourtheme/neutrope-japanese-invoice-pdfs-for-woocommerce/{$name}` があれば優先し、
 * 無ければプラグインの templates/{$name} を使う（上書き可能設計）。
 *
 * @param string              $name テンプレートファイル名（例: invoice.php）。
 * @param array<string,mixed> $args テンプレートへ渡す変数。
 * @return string レンダリング済み HTML。
 */
function wcjbp_get_template_html( $name, array $args = array() ) {
	$name = ltrim( $name, '/' );

	$theme_template = locate_template(
		array(
			'neutrope-japanese-invoice-pdfs-for-woocommerce/' . $name,
		)
	);

	$template = $theme_template ? $theme_template : WCJBP_PLUGIN_DIR . 'templates/' . $name;

	/**
	 * 使用するテンプレートパスをフィルタする。
	 *
	 * @param string $template 解決済みテンプレートパス。
	 * @param string $name     テンプレート名。
	 */
	$template = apply_filters( 'wcjbp_template_path', $template, $name );

	if ( ! is_readable( $template ) ) {
		return '';
	}

	ob_start();
	// テンプレート内で利用する変数を展開（キーは関数側で固定的に渡す）。
	// phpcs:ignore WordPress.PHP.DontExtract.extract_extract
	extract( $args, EXTR_SKIP );
	include $template;
	return (string) ob_get_clean();
}

/**
 * 注文の送料行を正規化して返す。
 *
 * 各配送行（WC_Order_Item_Shipping）について、税抜の送料と表示ラベルを返す。
 * 送料が 0 の行は除外する。複数配送行にも対応する。
 *
 * ラベルは配送方法名が取得できれば「送料（配送方法名）」、無ければ「送料」。
 *
 * @param WC_Order $order 注文。
 * @return array<int,array{label:string,total:float}>
 */
function wcjbp_get_shipping_rows( $order ) {
	$rows = array();

	if ( ! $order instanceof WC_Order ) {
		return $rows;
	}

	foreach ( $order->get_shipping_methods() as $shipping_item ) {
		// 送料（税抜）。get_total() は税抜の配送コスト。
		$ship_total = (float) $shipping_item->get_total();

		// 送料0円は表示しない。
		if ( abs( $ship_total ) < 0.00001 ) {
			continue;
		}

		$name = trim( (string) $shipping_item->get_name() );
		if ( '' !== $name ) {
			/* translators: %s: 配送方法名。 */
			$label = sprintf( __( '送料（%s）', 'neutrope-japanese-invoice-pdfs-for-woocommerce' ), $name );
		} else {
			$label = __( '送料', 'neutrope-japanese-invoice-pdfs-for-woocommerce' );
		}

		$rows[] = array(
			'label' => $label,
			'total' => $ship_total,
		);
	}

	return $rows;
}
