<?php
/**
 * Plugin settings (wp_option).
 *
 * @package DatvetaucaotocBooking
 */

declare(strict_types=1);

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

final class Datvetau_Booking_Settings {

	private const OPTION_KEY = 'datvetau_booking_settings';

	public static function defaults(): array {
		return array(
			'method_label'       => 'Chuyển khoản',
			'info_title'         => 'Thông tin thanh toán',
			'direct_pay_lead'    => 'Thanh toán tiền mặt:',
			'direct_pay_address' => '02 Hai Bà Trưng, Phường Ninh Kiều, Thành phố Cần Thơ (từ 08:30 - 11:30 và 14:00-16:30)',
			'transfer_lead'      => 'Chuyển khoản ngân hàng: tại 1 trong 2 số tài khoản sau:',
			'screenshot_note'    => 'Quý khách vui lòng giữ lại ảnh chụp màn hình thanh toán để đối chiếu',
			'policy_title'       => 'Quy định hủy đổi và hoàn tiền',
			'policy_link_href'   => '/cs-huy-doi/',
			'policy_link_label'  => 'Xem tại đây',
			'default_operator_logo' => '',
			'booking_notify_enabled'  => true,
			'booking_notify_to'       => '',
			'booking_notify_subject'  => 'KHÁCH ĐẶT VÉ MỚI',
			'banks'              => array(
				array(
					'id'             => 'bidv',
					'account_number' => '8600077779',
					'bank_name'      => 'BIDV',
					'qr_image_url'   => '',
					'qr_alt'         => 'Số tài khoản BIDV Phú Quốc Express',
					'qr_note'        => '(STK Ưu tiên, thanh toán 24/7)',
				),
				array(
					'id'             => 'vcb',
					'account_number' => '0091000648199',
					'bank_name'      => 'Vietcombank',
					'qr_image_url'   => '',
					'qr_alt'         => 'Số tài khoản Vietcombank Phú Quốc Express',
					'qr_note'        => '(STK Thanh toán từ 9:00-16:00)',
				),
			),
		);
	}

	public static function ensure_defaults(): void {
		$current = get_option( self::OPTION_KEY );
		if ( ! is_array( $current ) ) {
			update_option( self::OPTION_KEY, self::defaults() );
		}
	}

	public static function all(): array {
		self::ensure_defaults();
		$merged         = array_merge( self::defaults(), (array) get_option( self::OPTION_KEY, array() ) );
		$merged['banks'] = self::merge_banks_with_defaults( is_array( $merged['banks'] ?? null ) ? $merged['banks'] : array() );
		return $merged;
	}

	/**
	 * @param array<int,array<string,mixed>> $banks
	 * @return array<int,array<string,mixed>>
	 */
	private static function merge_banks_with_defaults( array $banks ): array {
		if ( ! $banks ) {
			return self::defaults()['banks'];
		}
		$by_id = array();
		foreach ( self::defaults()['banks'] as $def ) {
			$by_id[ (string) $def['id'] ] = $def;
		}
		$out = array();
		foreach ( $banks as $bank ) {
			if ( ! is_array( $bank ) ) {
				continue;
			}
			$id  = (string) ( $bank['id'] ?? '' );
			$def = $by_id[ $id ] ?? array();
			$out[] = array_merge( $def, $bank );
		}
		return $out ?: self::defaults()['banks'];
	}

	public static function update( array $values ): void {
		$merged = array_merge( self::all(), $values );
		update_option( self::OPTION_KEY, $merged );
	}

	/** Cập nhật copy thanh toán khi nâng plugin (chỉ khi vẫn là bản cũ trong DB). */
	public static function migrate_payment_copy_0_1_15(): void {
		$stored = get_option( self::OPTION_KEY );
		if ( ! is_array( $stored ) ) {
			return;
		}
		$defs    = self::defaults();
		$changed = false;

		$old_lead = 'Thanh toán trực tiếp:';
		if ( ( $stored['direct_pay_lead'] ?? '' ) === $old_lead ) {
			$stored['direct_pay_lead'] = $defs['direct_pay_lead'];
			$changed                   = true;
		}

		$old_addr = '02 Hai Bà Trưng, Phường Ninh Kiều, TP. Cần Thơ';
		if ( ( $stored['direct_pay_address'] ?? '' ) === $old_addr ) {
			$stored['direct_pay_address'] = $defs['direct_pay_address'];
			$changed                      = true;
		}

		$old_transfer = 'Thanh toán chuyển khoản: tại 1 trong 2 số tài khoản thuộc Công ty Cổ phần Tàu cao tốc Phú Quốc (Phú Quốc Express)';
		if ( ( $stored['transfer_lead'] ?? '' ) === $old_transfer ) {
			$stored['transfer_lead'] = $defs['transfer_lead'];
			$changed               = true;
		}

		if ( $changed ) {
			update_option( self::OPTION_KEY, $stored );
		}
	}

	public static function public_payload(): array {
		$s = self::all();
		return array(
			'methodLabel'      => $s['method_label'],
			'infoTitle'        => $s['info_title'],
			'directPayLead'    => $s['direct_pay_lead'],
			'directPayAddress' => $s['direct_pay_address'],
			'transferLead'     => $s['transfer_lead'],
			'screenshotNote'   => $s['screenshot_note'],
			'policyTitle'      => $s['policy_title'],
			'policyLinkHref'   => $s['policy_link_href'],
			'policyLinkLabel'  => $s['policy_link_label'],
			'banks'            => $s['banks'],
			'defaultOperatorLogo' => $s['default_operator_logo'],
		);
	}
}
