<?php

/**
 * Email Renderer
 * 
 * Renders email templates with content
 * 
 * @package WooNooW\Core\Notifications
 */

namespace WooNooW\Core\Notifications;



class EmailRenderer
{

	/**
	 * Instance
	 */
	private static $instance = null;

	/**
	 * Get instance
	 */
	public static function instance()
	{
		if (null === self::$instance) {
			self::$instance = new self();
		}
		return self::$instance;
	}

	/**
	 * Render email
	 * 
	 * @param string $event_id Event ID (order_placed, order_processing, etc.)
	 * @param string $recipient_type Recipient type (staff, customer)
	 * @param WC_Order|WC_Product|WC_Customer|mixed $data Order, Product, or Customer object
	 * @param array $extra_data Additional data
	 * @return array|null ['to', 'subject', 'body']
	 */
	public function render($event_id, $recipient_type, $data, $extra_data = [])
	{
		// Get template settings
		$template_settings = $this->get_template_settings($event_id, $recipient_type);

		if (!$template_settings) {
			return null;
		}

		// Get recipient email
		$to = $this->get_recipient_email($recipient_type, $data);

		if (!$to) {
			if (defined('WP_DEBUG') && WP_DEBUG) {
				error_log('[EmailRenderer] Failed to get recipient email for event: ' . $event_id);
			}
			return null;
		}

		// Get variables
		$variables = $this->get_variables($event_id, $data, $extra_data);

		// Replace variables in subject and content
		$subject = $this->replace_variables($template_settings['subject'], $variables);
		$content = $this->replace_variables($template_settings['body'], $variables);

		// Parse cards in content
		$content = $this->parse_cards($content);

		// Get HTML template
		$template_path = $this->get_design_template();

		// Render final HTML
		$html = $this->render_html($template_path, $content, $subject, $variables);

		return [
			'to' => $to,
			'subject' => $subject,
			'body' => $html,
		];
	}

	/**
	 * Get template settings
	 * 
	 * @param string $event_id
	 * @param string $recipient_type
	 * @return array|null
	 */
	public function get_template_settings($event_id, $recipient_type)
	{
		// Get saved template (with recipient_type for proper default template lookup)
		$template = TemplateProvider::get_template($event_id, 'email', $recipient_type);

		if (!$template) {
			if (defined('WP_DEBUG') && WP_DEBUG) {
			}
			return null;
		}

		if (defined('WP_DEBUG') && WP_DEBUG) {
		}

		// Get design template preference
		$settings = get_option('woonoow_notification_settings', []);
		$design = $settings['email_design_template'] ?? 'modern';

		return [
			'subject' => $template['subject'] ?? '',
			'body' => $template['body'] ?? '',
			'design' => $design,
		];
	}

	/**
	 * Get recipient email
	 * 
	 * @param string $recipient_type
	 * @param mixed $data
	 * @return string|null
	 */
	private function get_recipient_email($recipient_type, $data)
	{
		if ($recipient_type === 'staff') {
			return get_option('admin_email');
		}

		// Customer
		if ($data instanceof \WC_Order) {
			return $data->get_billing_email();
		}

		if ($data instanceof \WC_Customer) {
			return $data->get_email();
		}

		if ($data instanceof \WP_User) {
			return $data->user_email;
		}

		// Handle array data (e.g. subscription notifications)
		if (is_array($data)) {
			// Check for customer object in array
			if (isset($data['customer'])) {
				if ($data['customer'] instanceof \WP_User) {
					return $data['customer']->user_email;
				}
				if ($data['customer'] instanceof \WC_Customer) {
					return $data['customer']->get_email();
				}
			}

			// Check for direct email in data
			if (isset($data['email']) && is_email($data['email'])) {
				return $data['email'];
			}

			// Check for user_id
			if (isset($data['user_id'])) {
				$user = get_user_by('id', $data['user_id']);
				if ($user) {
					return $user->user_email;
				}
			}
		}

		if (defined('WP_DEBUG') && WP_DEBUG) {
			error_log('[EmailRenderer] Could not determine recipient email for type: ' . $recipient_type);
		}

		return null;
	}

	/**
	 * Get variables for template
	 * 
	 * @param string $event_id
	 * @param mixed $data
	 * @param array $extra_data
	 * @return array
	 */
	private function get_variables($event_id, $data, $extra_data = [])
	{
		$variables = [
			'site_name' => get_bloginfo('name'),
			'site_title' => get_bloginfo('name'),
			'store_name' => get_bloginfo('name'),
			'site_url' => home_url(),
			'shop_url' => get_permalink(wc_get_page_id('shop')),
			'my_account_url' => get_permalink(wc_get_page_id('myaccount')),
			'support_email' => get_option('admin_email'),
			'current_year' => date('Y'),
		];

		// Order variables
		if ($data instanceof \WC_Order) {
			// Calculate estimated delivery (3-5 business days from now)
			$estimated_delivery = date('F j', strtotime('+3 days')) . '-' . date('j', strtotime('+5 days'));

			// Completion date (for completed orders)
			$completion_date = '';
			if ($data->get_date_completed()) {
				$completion_date = $data->get_date_completed()->date('F j, Y');
			} else {
				$completion_date = date('F j, Y'); // Fallback to today
			}

			// Payment date
			$payment_date = '';
			if ($data->get_date_paid()) {
				$payment_date = $data->get_date_paid()->date('F j, Y');
			}

			$variables = array_merge($variables, [
				'order_number' => $data->get_order_number(),
				'order_id' => $data->get_id(),
				'order_date' => $data->get_date_created()->date('F j, Y'),
				'order_total' => $data->get_formatted_order_total(),
				'order_subtotal' => wc_price($data->get_subtotal()),
				'order_tax' => wc_price($data->get_total_tax()),
				'order_shipping' => wc_price($data->get_shipping_total()),
				'order_discount' => wc_price($data->get_discount_total()),
				'order_status' => wc_get_order_status_name($data->get_status()),
				'order_url' => $data->get_view_order_url(),
				'payment_method' => $data->get_payment_method_title(),
				'payment_status' => $data->get_status(),
				'payment_date' => $payment_date,
				'payment_error_reason' => $data->get_meta('_payment_error_reason') ?: 'Payment declined',
				'transaction_id' => $data->get_transaction_id() ?: 'N/A',
				'shipping_method' => $data->get_shipping_method(),
				'estimated_delivery' => $estimated_delivery,
				'completion_date' => $completion_date,
				'customer_name' => $data->get_formatted_billing_full_name(),
				'customer_first_name' => $data->get_billing_first_name(),
				'customer_last_name' => $data->get_billing_last_name(),
				'customer_email' => $data->get_billing_email(),
				'customer_phone' => $data->get_billing_phone(),
				'billing_address' => $data->get_formatted_billing_address(),
				'shipping_address' => $data->get_formatted_shipping_address(),
				// URLs
				'review_url' => $data->get_view_order_url(),
				'return_url' => $data->get_view_order_url(), // Customers click to initiate return
				'contact_url' => home_url('/contact'),
				'shop_url' => get_permalink(wc_get_page_id('shop')),
				'my_account_url' => get_permalink(wc_get_page_id('myaccount')),
				'account_url' => get_permalink(wc_get_page_id('myaccount')), // Alias for my_account_url
				'payment_retry_url' => $data->get_checkout_payment_url(),
				// Tracking (if available from meta)
				'tracking_number' => $data->get_meta('_tracking_number') ?: 'N/A',
				'tracking_url' => $data->get_meta('_tracking_url') ?: '#',
				'shipping_carrier' => $data->get_meta('_shipping_carrier') ?: 'Standard Shipping',
			]);


			// Order items table
			$items_html = '<table class="order-details" style="width: 100%; border-collapse: collapse;">';
			$items_html .= '<thead><tr>';
			$items_html .= '<th style="text-align: left; padding: 12px 0; border-bottom: 1px solid #e5e5e5;">Product</th>';
			$items_html .= '<th style="text-align: center; padding: 12px 0; border-bottom: 1px solid #e5e5e5;">Qty</th>';
			$items_html .= '<th style="text-align: right; padding: 12px 0; border-bottom: 1px solid #e5e5e5;">Price</th>';
			$items_html .= '</tr></thead><tbody>';

			foreach ($data->get_items() as $item) {
				$product = $item->get_product();
				$items_html .= '<tr>';
				$items_html .= sprintf(
					'<td style="padding: 16px 0; border-bottom: 1px solid #e5e5e5;">%s</td>',
					$item->get_name()
				);
				$items_html .= sprintf(
					'<td style="text-align: center; padding: 16px 0; border-bottom: 1px solid #e5e5e5;">%d</td>',
					$item->get_quantity()
				);
				$items_html .= sprintf(
					'<td style="text-align: right; padding: 16px 0; border-bottom: 1px solid #e5e5e5; font-weight: 600;">%s</td>',
					wc_price($item->get_total())
				);
				$items_html .= '</tr>';
			}

			$items_html .= '</tbody></table>';

			// All naming conventions for compatibility
			$variables['order_items'] = $items_html;
			$variables['order_items_table'] = $items_html;
			$variables['order_items_list'] = $items_html; // Alias used in some templates
		}

		// Product variables
		if ($data instanceof \WC_Product) {
			$variables = array_merge($variables, [
				'product_id' => $data->get_id(),
				'product_name' => $data->get_name(),
				'product_sku' => $data->get_sku(),
				'product_price' => wc_price($data->get_price()),
				'product_url' => get_permalink($data->get_id()),
				'stock_quantity' => $data->get_stock_quantity(),
				'stock_status' => $data->get_stock_status(),
			]);
		}

		// Customer variables
		if ($data instanceof \WC_Customer) {
			// Get temp password from user meta (stored during auto-registration)
			$user_temp_password = get_user_meta($data->get_id(), '_woonoow_temp_password', true);

			// Generate login URL (pointing to SPA login instead of wp-login)
			$appearance_settings = get_option('woonoow_appearance_settings', []);
			$spa_page_id = $appearance_settings['general']['spa_page'] ?? 0;
			$use_browser_router = $appearance_settings['general']['use_browser_router'] ?? true;

			if ($spa_page_id) {
				$spa_url = get_permalink($spa_page_id);
				// Use path format for BrowserRouter, hash format for HashRouter
				$login_url = $use_browser_router
					? trailingslashit($spa_url) . 'login'
					: $spa_url . '#/login';
			} else {
				$login_url = wp_login_url();
			}

			$variables = array_merge($variables, [
				'customer_id' => $data->get_id(),
				'customer_name' => $data->get_display_name(),
				'customer_first_name' => $data->get_first_name(),
				'customer_last_name' => $data->get_last_name(),
				'customer_email' => $data->get_email(),
				'customer_username' => $data->get_username(),
				'user_temp_password' => $user_temp_password ?: '',
				'login_url' => $login_url,
				'my_account_url' => get_permalink(wc_get_page_id('myaccount')),
				'shop_url' => get_permalink(wc_get_page_id('shop')),
			]);
		}

		// Subscription variables (passed as array)
		if (is_array($data) && isset($data['subscription'])) {
			$sub = $data['subscription'];
			// subscription object usually has: id, user_id, product_id, status, ...

			$sub_variables = [
				'subscription_id' => $sub->id ?? '',
				'subscription_status' => isset($sub->status) ? ucfirst($sub->status) : '',
				'billing_period' => isset($sub->billing_period) ? ucfirst($sub->billing_period) : '',
				'recurring_amount' => isset($sub->recurring_amount) ? wc_price($sub->recurring_amount) : '',
				'next_payment_date' => isset($sub->next_payment_date) ? date('F j, Y', strtotime($sub->next_payment_date)) : 'N/A',
				'end_date' => isset($sub->end_date) ? date('F j, Y', strtotime($sub->end_date)) : 'N/A',
				'cancel_reason' => $data['reason'] ?? '',
				'failed_count' => $data['failed_count'] ?? 0,
				'payment_link' => $data['payment_link'] ?? '',
			];

			// Get product name if not already set
			if (!isset($variables['product_name']) && isset($data['product']) && $data['product'] instanceof \WC_Product) {
				$sub_variables['product_name'] = $data['product']->get_name();
				$sub_variables['product_url'] = get_permalink($data['product']->get_id());
			}

			// Get customer details if not already set
			if (!isset($variables['customer_name']) && isset($data['customer']) && $data['customer'] instanceof \WP_User) {
				$user = $data['customer'];
				$sub_variables['customer_name'] = $user->display_name;
				$sub_variables['customer_email'] = $user->user_email;
			}

			$variables = array_merge($variables, $sub_variables);
		} else if (is_array($data) && isset($data['customer']) && $data['customer'] instanceof \WP_User) {
			// Basic user data passed in array without subscription (e.g. generalized notification)
			$user = $data['customer'];
			$variables = array_merge($variables, [
				'customer_name' => $user->display_name,
				'customer_email' => $user->user_email,
			]);
		}

		// Merge extra data
		$variables = array_merge($variables, $extra_data);

		return apply_filters('woonoow_email_variables', $variables, $event_id, $data);
	}

	/**
	 * Parse [card] tags and convert to HTML
	 * 
	 * @param string $content
	 * @return string
	 */
	public function parse_cards($content)
	{
		// Use a single unified regex to match BOTH syntaxes in document order
		// This ensures cards are rendered in the order they appear
		$combined_pattern = '/\[card(?::(\w+)|([^\]]*)?)\](.*?)\[\/card\]/s';

		preg_match_all($combined_pattern, $content, $matches, PREG_SET_ORDER | PREG_OFFSET_CAPTURE);

		if (empty($matches)) {
			// No cards found, wrap entire content in a single card
			return $this->render_card($content, []);
		}

		$html = '';
		foreach ($matches as $match) {
			// Determine which syntax was matched
			$full_match = $match[0][0];
			$new_syntax_type = !empty($match[1][0]) ? $match[1][0] : null;  // [card:type] format
			$old_syntax_attrs = $match[2][0] ?? '';  // [card type="..."] format
			$card_content = $match[3][0];

			if ($new_syntax_type) {
				// NEW syntax [card:type]
				$attributes = ['type' => $new_syntax_type];
			} else {
				// OLD syntax [card type="..."] or [card]
				$attributes = $this->parse_card_attributes($old_syntax_attrs);
			}

			$html .= $this->render_card($card_content, $attributes);
			$html .= $this->render_card_spacing();
		}

		// Remove last spacing
		$html = preg_replace('/<table[^>]*class="card-spacing"[^>]*>.*?<\/table>\s*$/s', '', $html);

		return $html;
	}

	/**
	 * Parse card attributes from [card ...] tag
	 * 
	 * @param string $attr_string
	 * @return array
	 */
	private function parse_card_attributes($attr_string)
	{
		$attributes = [
			'type' => 'default',
			'bg' => null,
		];

		// Parse type="highlight"
		if (preg_match('/type=["\']([^"\']+)["\']/', $attr_string, $match)) {
			$attributes['type'] = $match[1];
		}

		// Parse bg="url"
		if (preg_match('/bg=["\']([^"\']+)["\']/', $attr_string, $match)) {
			$attributes['bg'] = $match[1];
		}

		return $attributes;
	}

	/**
	 * Render a single card
	 * 
	 * @param string $content
	 * @param array $attributes
	 * @return string
	 */
	private function render_card($content, $attributes)
	{
		$type = $attributes['type'] ?? 'default';
		$bg = $attributes['bg'] ?? null;

		// Parse markdown in content
		$content = MarkdownParser::parse($content);

		// Get email customization settings for colors
		// Use unified colors from Appearance > General > Colors
		$appearance = get_option('woonoow_appearance_settings', []);
		$colors = $appearance['general']['colors'] ?? [];
		$primary_color = $colors['primary'] ?? '#7f54b3';
		$secondary_color = $colors['secondary'] ?? '#7f54b3';
		$button_text_color = '#ffffff'; // Always white on primary buttons
		$hero_gradient_start = $colors['gradientStart'] ?? '#667eea';
		$hero_gradient_end = $colors['gradientEnd'] ?? '#764ba2';
		$hero_text_color = '#ffffff'; // Always white on gradient

		// Parse button shortcodes with FULL INLINE STYLES for Gmail compatibility
		// Helper function to escape URL while preserving variable placeholders like {unsubscribe_url}
		$escape_url_preserving_variables = function ($url) {
			// If URL contains variable placeholder, don't escape (will be replaced later)
			if (preg_match('/\{[a-z_]+\}/', $url)) {
				// Just return the URL as-is - it will be replaced with a real URL later
				return $url;
			}
			return esc_url($url);
		};

		// Helper function to generate button HTML
		$generateButtonHtml = function ($url, $style, $text) use ($primary_color, $secondary_color, $button_text_color, $escape_url_preserving_variables) {
			$escaped_url = $escape_url_preserving_variables($url);

			if ($style === 'link') {
				// Plain link - just a simple <a> tag styled like regular text link (inline, no wrapper)
				return sprintf(
					'<a href="%s" style="color: %s; text-decoration: underline; font-family: \'Inter\', Arial, sans-serif;">%s</a>',
					$escaped_url,
					esc_attr($primary_color),
					esc_html($text)
				);
			}

			// Styled buttons (solid/outline) get table wrapper for email client compatibility
			if ($style === 'outline') {
				// Outline button - transparent background with border
				$button_style = sprintf(
					'display: inline-block; background-color: transparent; color: %s; padding: 14px 28px; border: 2px solid %s; border-radius: 6px; text-decoration: none; font-weight: 600; font-family: "Inter", Arial, sans-serif; font-size: 16px; text-align: center; mso-padding-alt: 0;',
					esc_attr($secondary_color),
					esc_attr($secondary_color)
				);
			} else {
				// Solid button - full background color
				$button_style = sprintf(
					'display: inline-block; background-color: %s; color: %s; padding: 14px 28px; border: none; border-radius: 6px; text-decoration: none; font-weight: 600; font-family: "Inter", Arial, sans-serif; font-size: 16px; text-align: center; mso-padding-alt: 0;',
					esc_attr($primary_color),
					esc_attr($button_text_color)
				);
			}

			// Use table-based button for better email client compatibility
			return sprintf(
				'<table role="presentation" border="0" cellpadding="0" cellspacing="0" style="margin: 16px auto;"><tr><td align="center"><a href="%s" style="%s">%s</a></td></tr></table>',
				$escaped_url,
				$button_style,
				esc_html($text)
			);
		};

		// NEW FORMAT: [button:style](url)Text[/button]
		$content = preg_replace_callback(
			'/\[button:(\w+)\]\(([^)]+)\)([^\[]+)\[\/button\]/',
			function ($matches) use ($generateButtonHtml) {
				$style = $matches[1]; // solid or outline
				$url = $matches[2];
				$text = trim($matches[3]);
				return $generateButtonHtml($url, $style, $text);
			},
			$content
		);

		// OLD FORMAT: [button url="..." style="solid|outline"]Text[/button]
		$content = preg_replace_callback(
			'/\[button\s+url=["\']([^"\']+)["\'](?:\s+style=["\'](solid|outline)["\'])?\]([^\[]+)\[\/button\]/',
			function ($matches) use ($generateButtonHtml) {
				$url = $matches[1];
				$style = $matches[2] ?? 'solid';
				$text = trim($matches[3]);
				return $generateButtonHtml($url, $style, $text);
			},
			$content
		);

		$class = 'card';
		$style = 'width: 100%; background-color: #ffffff; border-radius: 8px;';
		$content_style = 'padding: 32px 40px;';

		// Add type class and styling
		if ($type !== 'default') {
			$class .= ' card-' . esc_attr($type);

			// Apply gradient and text color for hero cards
			if ($type === 'hero') {
				$style .= sprintf(
					' background: linear-gradient(135deg, %s 0%%, %s 100%%);',
					esc_attr($hero_gradient_start),
					esc_attr($hero_gradient_end)
				);
				$content_style .= sprintf(' color: %s;', esc_attr($hero_text_color));

				// Add inline color to all headings and paragraphs for email client compatibility
				// Preserve existing style attributes (like text-align) by appending to them
				$content = preg_replace_callback(
					'/<(h[1-6]|p)([^>]*?)(\s+style=["\']([^"\']*)["\'])?([^>]*)>/',
					function ($matches) use ($hero_text_color) {
						$tag = $matches[1];
						$before_style = $matches[2];
						$existing_style = isset($matches[4]) ? $matches[4] : '';
						$after_style = $matches[5];
						$color_style = 'color: ' . esc_attr($hero_text_color) . ';';

						if ($existing_style) {
							// Append to existing style
							$new_style = rtrim($existing_style, ';') . '; ' . $color_style;
							return '<' . $tag . $before_style . ' style="' . $new_style . '"' . $after_style . '>';
						} else {
							// Add new style attribute
							return '<' . $tag . $before_style . ' style="' . $color_style . '"' . $after_style . '>';
						}
					},
					$content
				);
			}
			// Success card - green theme
			elseif ($type === 'success') {
				$style .= ' background-color: #f0fdf4;';
			}
			// Info card - blue theme
			elseif ($type === 'info') {
				$style .= ' background-color: #f0f7ff;';
			}
			// Warning card - orange/yellow theme
			elseif ($type === 'warning') {
				$style .= ' background-color: #fff8e1;';
			}
			// Basic card - plain text, no card styling (for footers/muted content)
			elseif ($type === 'basic') {
				$style = 'width: 100%; background-color: transparent;'; // No background
				$content_style = 'padding: 0;'; // No padding
			}
		}

		// Add background image
		if ($bg) {
			$class .= ' card-bg';
			$style .= ' background-image: url(' . esc_url($bg) . ');';
		}

		return sprintf(
			'<table role="presentation" class="%s" border="0" cellpadding="0" cellspacing="0" style="%s">
				<tr>
					<td class="content" style="%s">
						%s
					</td>
				</tr>
			</table>',
			$class,
			$style,
			$content_style,
			$content
		);
	}

	/**
	 * Render card spacing
	 * 
	 * @return string
	 */
	private function render_card_spacing()
	{
		return '<table role="presentation" border="0" cellpadding="0" cellspacing="0" width="100%">
			<tr><td class="card-spacing" style="height: 24px; font-size: 24px; line-height: 24px;">&nbsp;</td></tr>
		</table>';
	}

	/**
	 * Replace variables in text
	 * 
	 * @param string $text
	 * @param array $variables
	 * @return string
	 */
	private function replace_variables($text, $variables)
	{
		foreach ($variables as $key => $value) {
			$text = str_replace('{' . $key . '}', $value, $text);
		}

		return $text;
	}

	/**
	 * Get design template path
	 * 
	 * @return string
	 */
	public function get_design_template()
	{
		// Use single base template (theme-agnostic)
		$template_path = WOONOOW_PATH . 'templates/emails/base.html';

		// Allow filtering template path
		$template_path = apply_filters('woonoow_email_template', $template_path);

		// Fallback to base if custom template doesn't exist
		if (!file_exists($template_path)) {
			$template_path = WOONOOW_PATH . 'templates/emails/base.html';
		}

		return $template_path;
	}

	/**
	 * Render HTML email
	 * 
	 * @param string $template_path Path to HTML template
	 * @param string $content Email content (HTML)
	 * @param string $subject Email subject
	 * @param array $variables All variables
	 * @return string
	 */
	public function render_html($template_path, $content, $subject, $variables)
	{
		if (!file_exists($template_path)) {
			// Fallback to plain HTML
			return $content;
		}

		// Load template
		$html = file_get_contents($template_path);

		// Get email customization settings
		$email_settings = get_option('woonoow_email_settings', []);

		// Ensure required variables have defaults
		$variables['site_url'] = $variables['site_url'] ?? home_url();
		$variables['store_name'] = $variables['store_name'] ?? get_bloginfo('name');

		// Email body background
		$body_bg = '#f8f8f8';

		// Email header (logo or text)
		$logo_url = $email_settings['logo_url'] ?? '';

		// Fallback to site icon if no logo set
		if (empty($logo_url) && has_site_icon()) {
			$logo_url = get_site_icon_url(200);
		}

		if (!empty($logo_url)) {
			$header = sprintf(
				'<a href="%s"><img src="%s" alt="%s" style="max-width: 200px; max-height: 60px;"></a>',
				esc_url($variables['site_url']),
				esc_url($logo_url),
				esc_attr($variables['store_name'])
			);
		} else {
			// No logo, use text header
			$header_text = !empty($email_settings['header_text']) ? $email_settings['header_text'] : $variables['store_name'];
			$header = sprintf(
				'<a href="%s" style="font-size: 24px; font-weight: 700; color: #333; text-decoration: none;">%s</a>',
				esc_url($variables['site_url']),
				esc_html($header_text)
			);
		}

		// Email footer with {current_year} variable support
		$footer_text = !empty($email_settings['footer_text']) ? $email_settings['footer_text'] : sprintf(
			'© %s %s. All rights reserved.',
			date('Y'),
			$variables['store_name']
		);

		// Replace {current_year} with actual year
		$footer_text = str_replace('{current_year}', date('Y'), $footer_text);

		// Social icons with PNG images
		$social_html = '';
		if (!empty($email_settings['social_links']) && is_array($email_settings['social_links'])) {
			$icon_color = !empty($email_settings['social_icon_color']) ? $email_settings['social_icon_color'] : 'white';
			$social_html = '<div class="social-icons" style="margin-top: 16px; text-align: center;">';
			foreach ($email_settings['social_links'] as $link) {
				if (!empty($link['url']) && !empty($link['platform'])) {
					$icon_url = $this->get_social_icon_url($link['platform'], $icon_color);
					$social_html .= sprintf(
						'<a href="%s" style="display: inline-block; margin: 0 8px;"><img src="%s" alt="%s" style="width: 24px; height: 24px;"></a>',
						esc_url($link['url']),
						esc_url($icon_url),
						esc_attr(ucfirst($link['platform']))
					);
				}
			}
			$social_html .= '</div>';
		}

		$footer = sprintf(
			'<p style="font-family: \'Inter\', Arial, sans-serif; font-size: 13px; line-height: 1.5; color: #888888; margin: 0 0 8px 0; text-align: center;">%s</p>%s',
			nl2br(esc_html($footer_text)),
			$social_html
		);

		// Replace placeholders
		$html = str_replace('{{email_subject}}', esc_html($subject), $html);
		$html = str_replace('{{email_body_bg}}', esc_attr($body_bg), $html);
		$html = str_replace('{{email_header}}', $header, $html);
		$html = str_replace('{{email_content}}', $content, $html);
		$html = str_replace('{{email_footer}}', $footer, $html);
		$html = str_replace('{{store_name}}', esc_html($variables['store_name']), $html);
		$html = str_replace('{{site_url}}', esc_url($variables['site_url']), $html);
		$html = str_replace('{{current_year}}', date('Y'), $html);

		// Replace all other variables
		foreach ($variables as $key => $value) {
			$html = str_replace('{{' . $key . '}}', $value, $html);
		}

		return $html;
	}

	/**
	 * Get social icon URL
	 * 
	 * @param string $platform
	 * @param string $color 'white' or 'black'
	 * @return string
	 */
	private function get_social_icon_url($platform, $color = 'white')
	{
		// Use plugin URL constant if available, otherwise calculate from file path
		if (defined('WOONOOW_URL')) {
			$plugin_url = WOONOOW_URL;
		} else {
			// File is at includes/Core/Notifications/EmailRenderer.php - need 4 levels up
			$plugin_url = plugin_dir_url(dirname(dirname(dirname(dirname(__FILE__)))));
		}
		$filename = sprintf('mage--%s-%s.png', $platform, $color);
		return $plugin_url . 'assets/icons/' . $filename;
	}
}
