<?php
/**
 * Mersal Notifications — setup wizard definition.
 *
 * The chrome, the account step, the not-subscribed gate and the saving all live
 * in the shared Suite SDK (class-mersal-suite-wizard.php). This file only says
 * what Mersal Notifications needs asked: which gateway sends, who receives, the
 * first rules to switch on, and how the sender identifies itself.
 *
 * @package Mersal_Notifications
 */

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

/**
 * Registers the Notifications wizard with the Suite.
 */
class Mersal_Notif_Wizard {

	/**
	 * Register with the shared wizard.
	 */
	public static function init() {
		if ( ! class_exists( 'Mersal_Suite_Wizard' ) ) {
			return;
		}

		Mersal_Suite_Wizard::register(
			array(
				'id'           => 'nt',
				'title'        => array( 'ar' => 'مرسال للإشعارات', 'en' => 'Mersal Notifications' ),
				'icon'         => 'notifications',
				'accent'       => '#2f86c9',
				'app'          => 'notifications',
				'field'        => 'mnotif',
				'save'         => array( 'Mersal_Notif_Settings', 'update' ),
				'finish'       => 'nt.dash',
				'intro'        => self::intro(),
				'account'      => self::account(),
				'steps'        => self::steps(),
				'finish_links' => array(
					array(
						'route' => 'nt.rules',
						'icon'  => 'rule',
						'title' => array( 'ar' => 'كل القواعد', 'en' => 'All rules' ),
						'text'  => array( 'ar' => 'شوف الإشعارات اللي اتفعلت وعدّل نصوصها.', 'en' => 'See the notifications you switched on and edit their wording.' ),
					),
					array(
						'route' => 'nt.edit',
						'icon'  => 'add_circle',
						'title' => array( 'ar' => 'قاعدة جديدة', 'en' => 'New rule' ),
						'text'  => array( 'ar' => 'ابنِ إشعار من الصفر لأي حدث.', 'en' => 'Build a notification from scratch for any event.' ),
					),
					array(
						'route' => 'nt.cart',
						'icon'  => 'shopping_cart',
						'title' => array( 'ar' => 'السلات المتروكة', 'en' => 'Abandoned carts' ),
						'text'  => array( 'ar' => 'استرجع الطلبات اللي وقفت قبل الدفع.', 'en' => 'Win back the orders that stalled before payment.' ),
					),
					array(
						'route' => 'nt.log',
						'icon'  => 'fact_check',
						'title' => array( 'ar' => 'سجل التسليم', 'en' => 'Delivery log' ),
						'text'  => array( 'ar' => 'تابع كل إشعار اتبعت ووصل ولا لأ.', 'en' => 'Track every notification and whether it landed.' ),
					),
				),
			)
		);
	}

	/**
	 * Welcome-screen copy.
	 *
	 * @return array
	 */
	private static function intro() {
		return array(
			'minutes' => 4,
			'lead'    => array(
				'ar' => 'مرسال للإشعارات بيبعت رسالة تلقائية لعميلك وللإدارة عند أي حدث في الموقع — طلب جديد، دفع، شحن، تسجيل، أو سلة اتسابت. المعالج ده هيوصلك لأول إشعار شغّال في دقايق.',
				'en' => 'Mersal Notifications fires an automatic message to your customer and your team on any site event — a new order, a payment, a shipment, a sign-up, an abandoned cart. This wizard gets your first one live in minutes.',
			),
			'points'  => array(
				array(
					'icon'  => 'bolt',
					'title' => array( 'ar' => 'إشعارات فورية عند كل حدث', 'en' => 'Instant on every event' ),
					'text'  => array( 'ar' => 'حالات ووكومرس كلها + تسجيل المستخدمين + أحداث تعملها بنفسك.', 'en' => 'Every WooCommerce status, user sign-ups, and events you define yourself.' ),
				),
				array(
					'icon'  => 'forum',
					'title' => array( 'ar' => 'واتساب و SMS وإيميل', 'en' => 'WhatsApp, SMS and e-mail' ),
					'text'  => array( 'ar' => 'نفس الإشعار يروح على أكتر من قناة وللعميل وللأدمن.', 'en' => 'One notification, several channels, to the customer and your admins.' ),
				),
				array(
					'icon'  => 'shuffle',
					'title' => array( 'ar' => 'صيغ متعددة للرسالة الواحدة', 'en' => 'Several wordings per message' ),
					'text'  => array( 'ar' => 'خزّن أكتر من صيغة وخلي مرسال تبدّل بينهم — أنفع كتير للواتساب.', 'en' => 'Keep more than one wording and let Mersal rotate them — much safer on WhatsApp.' ),
				),
				array(
					'icon'  => 'shopping_cart',
					'title' => array( 'ar' => 'استرجاع السلات المتروكة', 'en' => 'Abandoned cart recovery' ),
					'text'  => array( 'ar' => 'تتبّع السلة وذكّر العميل بعد وقت تحدده.', 'en' => 'Track the cart and nudge the customer after a delay you choose.' ),
				),
			),
		);
	}

	/**
	 * Account-step callbacks.
	 *
	 * @return array
	 */
	private static function account() {
		$connect = static function () {
			static $c = null;
			if ( null === $c ) {
				$c = new Mersal_Notif_Connect();
			}
			return $c;
		};

		return array(
			'is_connected'       => static function () use ( $connect ) {
				return $connect()->is_connected();
			},
			'name'               => static function () use ( $connect ) {
				return $connect()->account_name();
			},
			'email'              => static function () use ( $connect ) {
				return $connect()->account_email();
			},
			'plan'               => static function () use ( $connect ) {
				return $connect()->plan_label();
			},
			'error'              => static function () use ( $connect ) {
				return $connect()->last_connect_error();
			},
			'needs_subscription' => static function () use ( $connect ) {
				return ! $connect()->is_connected() && $connect()->needs_subscription();
			},
			'connect_url'        => static function () use ( $connect ) {
				return $connect()->launch_url();
			},
			'sync_url'           => static function () use ( $connect ) {
				return $connect()->sync_gateways_url();
			},
		);
	}

	/**
	 * The settings steps.
	 *
	 * @return array
	 */
	private static function steps() {
		return array(
			array(
				'id'     => 'gateways',
				'icon'   => 'router',
				'title'  => array( 'ar' => 'البوابات', 'en' => 'Gateways' ),
				'sub'    => array( 'ar' => 'مين اللي هيبعت الإشعارات', 'en' => 'What actually sends the notifications' ),
				'render' => array( __CLASS__, 'step_gateways' ),
			),
			array(
				'id'     => 'sender',
				'icon'   => 'badge',
				'title'  => array( 'ar' => 'هوية المُرسِل', 'en' => 'Sender identity' ),
				'sub'    => array( 'ar' => 'الاسم والبريد اللي العميل هيشوفهم', 'en' => 'The name and address your customer sees' ),
				'render' => array( __CLASS__, 'step_sender' ),
			),
			array(
				'id'     => 'starter',
				'icon'   => 'rocket_launch',
				'title'  => array( 'ar' => 'إشعارات جاهزة تبدأ بيها', 'en' => 'Ready-made notifications' ),
				'sub'    => array( 'ar' => 'اختار اللي يهمّك وهنجهّزهم بنصوص احترافية', 'en' => 'Pick what matters and we build them with professional copy' ),
				'render' => array( __CLASS__, 'step_starter' ),
				'save'   => array( __CLASS__, 'save_starter' ),
			),
			array(
				'id'     => 'safety',
				'icon'   => 'health_and_safety',
				'title'  => array( 'ar' => 'حماية حساب الواتساب', 'en' => 'Protecting your WhatsApp number' ),
				'sub'    => array( 'ar' => 'إعدادات بتقلّل فرصة الحظر', 'en' => 'Settings that cut your chance of a ban' ),
				'render' => array( __CLASS__, 'step_safety' ),
			),
		);
	}

	/* ------------------------------------------------------------------ */
	/* Step renderers                                                     */
	/* ------------------------------------------------------------------ */

	/**
	 * Gateway pickers.
	 *
	 * @param Mersal_Suite        $ctx Suite context.
	 * @param Mersal_Suite_Wizard $f   Field helpers.
	 */
	public static function step_gateways( $ctx, $f ) {
		$s       = Mersal_Notif_Settings::all();
		$ar      = 'ar' === $ctx->lang();
		$connect = new Mersal_Notif_Connect();
		$gws     = $connect->gateways();

		$wa    = array( '' => $ar ? 'اختيار تلقائي (أول بوابة متاحة)' : 'Pick automatically (first available)' );
		$sms   = $wa;
		$email = $wa;
		foreach ( $gws as $g ) {
			$label = $g['name'] . ( ! empty( $g['address'] ) ? ' — ' . $g['address'] : '' );
			if ( $connect->gateway_matches_type_public( $g['channel'], 'whatsapp' ) ) {
				$wa[ $g['uid'] ] = $label;
			}
			if ( $connect->gateway_matches_type_public( $g['channel'], 'sms' ) ) {
				$sms[ $g['uid'] ] = $label;
			}
			if ( $connect->gateway_matches_type_public( $g['channel'], 'email' ) ) {
				$email[ $g['uid'] ] = $label;
			}
		}

		if ( count( $wa ) < 2 ) {
			$f->note(
				$ar ? 'مفيش بوابة واتساب ظاهرة على حسابك لحد دلوقتي. اربط واحدة من mersal.it وبعدين ارجع اضغط «تحديث البيانات» في خطوة الحساب.' : 'No WhatsApp gateway is showing on your account yet. Connect one on mersal.it, then come back and hit Refresh on the account step.',
				'warning'
			);
		}

		$f->select( 'mnotif[wa_gateway]', $s['wa_gateway'] ?? '', $ar ? 'بوابة الواتساب' : 'WhatsApp gateway', $wa );
		$f->select( 'mnotif[sms_gateway]', $s['sms_gateway'] ?? '', $ar ? 'بوابة الـSMS' : 'SMS gateway', $sms );

		echo '<div style="height:6px;"></div>';
		$f->cards(
			'mnotif[email_provider]',
			$s['email_provider'] ?? 'wordpress',
			array(
				'wordpress' => array( 'dns', $ar ? 'وردبريس / SMTP' : 'WordPress / SMTP', $ar ? 'الإرسال من السيرفر' : 'Send from this server' ),
				'mersal'    => array( 'hub', $ar ? 'حساب مرسال' : 'Mersal account', $ar ? 'الإرسال عبر بوابة مرسال' : 'Send via your Mersal gateway' ),
			)
		);
		$f->select( 'mnotif[email_gateway]', $s['email_gateway'] ?? '', $ar ? 'بوابة الإيميل (لو اخترت مرسال)' : 'E-mail gateway (if you picked Mersal)', $email );
	}

	/**
	 * Sender identity.
	 *
	 * @param Mersal_Suite        $ctx Suite context.
	 * @param Mersal_Suite_Wizard $f   Field helpers.
	 */
	public static function step_sender( $ctx, $f ) {
		$s  = Mersal_Notif_Settings::all();
		$ar = 'ar' === $ctx->lang();

		$f->grid();
		$f->text( 'mnotif[email_from_name]', $s['email_from_name'] ?? '', $ar ? 'اسم المُرسِل' : 'From name', $ar ? 'سيبه فاضي عشان يستخدم اسم الموقع.' : 'Leave empty to use the site name.' );
		$f->text( 'mnotif[email_from]', $s['email_from'] ?? '', $ar ? 'بريد المُرسِل' : 'From e-mail', 'noreply@example.com', 'email' );
		$f->grid( false );

		$f->select(
			'mnotif[lang]',
			$s['lang'] ?? 'ar',
			$ar ? 'لغة اللوحة والنصوص الجاهزة' : 'Dashboard and ready-made copy language',
			array( 'ar' => $ar ? 'العربية' : 'Arabic', 'en' => $ar ? 'الإنجليزية' : 'English' )
		);

		$f->note(
			$ar ? 'كل رسالة تقدر يبقى لها نسخة بلغة تانية كمان — العميل بيستقبل النسخة المناسبة للغته تلقائيًا.' : 'Any message can also carry a second language — each recipient gets the version matching their locale automatically.',
			'translate'
		);
	}

	/**
	 * Starter notifications.
	 *
	 * @param Mersal_Suite        $ctx Suite context.
	 * @param Mersal_Suite_Wizard $f   Field helpers.
	 */
	public static function step_starter( $ctx, $f ) {
		$ar  = 'ar' === $ctx->lang();
		$woo = class_exists( 'WooCommerce' );

		$picks = $woo
			? array(
				'wc_new_order'        => array( 'receipt_long', $ar ? 'تأكيد الطلب' : 'Order confirmation', $ar ? 'أول رسالة بعد ما العميل يطلب.' : 'The first message after an order lands.' ),
				'wc_payment_complete' => array( 'payments', $ar ? 'تأكيد الدفع' : 'Payment received', $ar ? 'إيصال يطمّن العميل إن فلوسه وصلت.' : 'A receipt that reassures the customer.' ),
				'wc_status_completed' => array( 'local_shipping', $ar ? 'الطلب اكتمل / اتشحن' : 'Order completed / shipped', $ar ? 'أكتر رسالة بتقلّل استفسارات «فين طلبي؟».' : 'The one that kills "where is my order?" tickets.' ),
				'ac_abandoned'        => array( 'shopping_cart', $ar ? 'سلة متروكة' : 'Abandoned cart', $ar ? 'تذكير بعد ساعة من ترك السلة.' : 'A nudge an hour after the cart stalls.' ),
			)
			: array(
				'user_register'       => array( 'person_add', $ar ? 'ترحيب بالعضو الجديد' : 'Welcome a new member', $ar ? 'رسالة ترحيب فور التسجيل.' : 'A welcome the moment they sign up.' ),
				'user_password_reset' => array( 'lock_reset', $ar ? 'تنبيه تغيير كلمة السر' : 'Password reset alert', $ar ? 'تنبيه أمان للمستخدم.' : 'A security heads-up for the user.' ),
			);

		echo '<div class="msw-cards" style="grid-template-columns:1fr;">';
		foreach ( $picks as $key => $p ) {
			echo '<label class="msw-toggle" style="border-top:0;">';
			echo '<input type="hidden" name="starter[' . esc_attr( $key ) . ']" value="0">';
			echo '<input type="checkbox" name="starter[' . esc_attr( $key ) . ']" value="1" checked>';
			echo '<span class="msw-toggle-ui"></span>';
			echo '<span class="msw-toggle-txt"><b>' . esc_html( $p[1] ) . '</b><span>' . esc_html( $p[2] ) . '</span></span>';
			echo '</label>';
		}
		echo '</div>';

		$f->select(
			'starter_channel',
			'whatsapp',
			$ar ? 'ابعتهم على' : 'Send them over',
			array(
				'whatsapp' => $ar ? 'واتساب' : 'WhatsApp',
				'sms'      => 'SMS',
				'email'    => $ar ? 'الإيميل' : 'E-mail',
			)
		);

		$f->note(
			$ar ? 'كل إشعار هيتعمل بخمس صيغ احترافية جاهزة ومتوافقة مع الواتساب، ومرسال هتبدّل بينهم تلقائيًا. تقدر تعدّلهم أو تختار صيغة ثابتة من شاشة القاعدة.' : 'Each one is created with five professional, WhatsApp-safe wordings that Mersal rotates automatically. Edit them, or pin one, from the rule screen.',
			'shuffle'
		);
	}

	/**
	 * Create the picked starter rules.
	 *
	 * @param array $post Raw POST.
	 */
	public static function save_starter( $post ) {
		$picked  = isset( $post['starter'] ) && is_array( $post['starter'] ) ? $post['starter'] : array();
		$channel = isset( $post['starter_channel'] ) ? sanitize_key( $post['starter_channel'] ) : 'whatsapp';
		if ( ! in_array( $channel, array( 'whatsapp', 'sms', 'email' ), true ) ) {
			$channel = 'whatsapp';
		}

		$core = new Mersal_Notif_Core();
		$lang = Mersal_Notif_Settings::get( 'lang', 'ar' );

		// Don't stack duplicates when someone walks the wizard twice.
		$existing = array();
		foreach ( $core->get_rules() as $r ) {
			$existing[ $r['trigger_key'] ] = true;
		}

		foreach ( $picked as $trigger => $on ) {
			$trigger = sanitize_text_field( $trigger );
			if ( empty( $on ) || isset( $existing[ $trigger ] ) ) {
				continue;
			}
			$variants = Mersal_Notif_Library::variants( $trigger, $lang );
			if ( empty( $variants ) ) {
				continue;
			}
			$core->save_rule(
				array(
					'trigger_key'   => $trigger,
					'enabled'       => 1,
					'channels'      => array( $channel ),
					'recipients'    => array( 'customer' ),
					'message'       => $variants[0],
					'variants'      => $variants,
					'variant_mode'  => 'rotate',
					'email_subject' => Mersal_Notif_Library::subject( $trigger, $lang ),
					'delay_value'   => ( 'ac_abandoned' === $trigger ) ? 60 : 0,
					'delay_unit'    => 'minutes',
				)
			);
		}
	}

	/**
	 * Anti-ban settings.
	 *
	 * @param Mersal_Suite        $ctx Suite context.
	 * @param Mersal_Suite_Wizard $f   Field helpers.
	 */
	public static function step_safety( $ctx, $f ) {
		$s  = Mersal_Notif_Settings::all();
		$ar = 'ar' === $ctx->lang();

		$f->note(
			$ar ? 'واتساب بيحظر الأرقام اللي بتبعت نفس النص لناس كتير في وقت قصير. الإعدادات دي بتقلّل الخطر ده جدًا.' : 'WhatsApp bans numbers that send the same text to many people in a short window. These settings cut that risk sharply.',
			'health_and_safety'
		);

		$f->toggle( 'mnotif[variant_rotation]', ! isset( $s['variant_rotation'] ) ? 1 : $s['variant_rotation'], $ar ? 'التبديل بين صيغ الرسالة' : 'Rotate message wordings', $ar ? 'كل رسالة تخرج بصيغة مختلفة من الصيغ المحفوظة بدل نص واحد متكرر.' : 'Each send picks a different saved wording instead of repeating one text.' );

		$f->select(
			'mnotif[notif_min_gap]',
			$s['notif_min_gap'] ?? 0,
			$ar ? 'أقل فاصل بين رسالتين للعميل الواحد' : 'Minimum gap between two messages to the same person',
			array(
				0  => $ar ? 'بدون فاصل' : 'No gap',
				1  => $ar ? 'ساعة' : '1 hour',
				6  => $ar ? '6 ساعات' : '6 hours',
				24 => $ar ? 'يوم' : '24 hours',
			),
			$ar ? 'بيمنع إن العميل يتلاحق برسايل كتير من قواعد مختلفة.' : 'Stops several rules piling onto the same customer at once.'
		);

		echo '<div class="msw-field"><label>' . esc_html( $ar ? 'أرقام محظورة (رقم في كل سطر)' : 'Blocked numbers (one per line)' ) . '</label>';
		echo '<textarea class="msw-input" rows="4" dir="ltr" name="mnotif[notif_blocked_numbers]" placeholder="20100000000">' . esc_textarea( $s['notif_blocked_numbers'] ?? '' ) . '</textarea>';
		echo '<small>' . esc_html( $ar ? 'الأرقام دي مش هيوصلها أي إشعار نهائيًا.' : 'These numbers never receive any notification.' ) . '</small></div>';
	}
}
