<?php
/**
 * Wysyłanie powiadomień email
 *
 * Obsługuje notyfikacje o błędach synchronizacji, potwierdzeniach,
 * circuit breaker oraz innych ważnych zdarzeniach.
 *
 * @package KSEF\WordPress
 */

namespace KSEF\WordPress;

// phpcs:disable WordPress.DB.DirectDatabaseQuery, WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.PreparedSQLPlaceholders, WordPress.DB.SlowDBQuery, PluginCheck.Security.DirectDB.UnescapedDBParameter -- Wlasne tabele gksef_*: wartosci przez $wpdb->prepare()/esc_like(), nazwy tabel z $wpdb->prefix, paginacja rzutowana (int); nonce weryfikowany w handlerze (check_ajax_referer/check_admin_referer).

/**
 * Email_Notifier — wysyłanie maili
 *
 * Obsługuje:
 * - Błędy synchronizacji (incoming/outgoing)
 * - Potwierdzenie faktury (confirmed status)
 * - Circuit breaker open/close
 * - Rate limiting (max 1 mail/10 min per credential)
 */
class Email_Notifier {

	/**
	 * Wyślij notyfikację o błędzie synchronizacji
	 *
	 * @param int    $sync_log_id ID logu synchronizacji.
	 * @param string $error_message Wiadomość błędu.
	 * @return bool Czy email został wysłany
	 */
	public static function send_sync_error( $sync_log_id, $error_message ) {
		global $wpdb;

		// Pobierz log
		$sync_log = $wpdb->get_row(
			$wpdb->prepare(
				"SELECT * FROM {$wpdb->prefix}gksef_sync_log WHERE id = %d",
				$sync_log_id
			),
			ARRAY_A
		);

		if ( ! $sync_log ) {
			return false;
		}

		// Sprawdź czy notyfikacje są włączone
		if ( ! self::are_notifications_enabled() ) {
			return false;
		}

		// Sprawdź czy włączone są notyfikacje o błędach
		if ( ! get_option( 'gksef_email_notify_errors', 1 ) ) {
			return false;
		}

		// Rate limiting
		if ( ! self::should_send_email( 'error', $sync_log['credential_id'] ) ) {
			return false;
		}

		$recipient = self::get_email_recipient();
		$subject   = sprintf(
			// translators: %s = komunikat bledu synchronizacji
			__( '[KSEF] Błąd synchronizacji — %s', 'prostafaktura-ksef' ),
			ucfirst( $sync_log['sync_type'] )
		);

		$headers = [ 'Content-Type: text/html; charset=UTF-8' ];

		$body = self::build_error_email( $sync_log, $error_message );

		$result = wp_mail( $recipient, $subject, $body, $headers );

		if ( $result ) {
			self::log_email_sent( 'error', $sync_log['credential_id'] );
		}

		return $result;
	}

	/**
	 * Wyślij notyfikację o potwierdzeniu faktury
	 *
	 * @param int $invoice_id ID faktury wysłanej.
	 * @return bool
	 */
	public static function send_invoice_confirmed( $invoice_id ) {
		global $wpdb;

		// Pobierz fakturę
		$invoice = $wpdb->get_row(
			$wpdb->prepare(
				"SELECT * FROM {$wpdb->prefix}gksef_outgoing_invoices WHERE id = %d",
				$invoice_id
			),
			ARRAY_A
		);

		if ( ! $invoice ) {
			return false;
		}

		// Sprawdzenie warunków
		if ( ! self::are_notifications_enabled() ) {
			return false;
		}

		if ( ! get_option( 'gksef_email_notify_confirmed', 0 ) ) {
			return false;
		}

		$recipient = self::get_email_recipient();
		$subject   = sprintf(
			// translators: %s = numer faktury
			__( '[KSEF] Faktura potwierdzona — %s', 'prostafaktura-ksef' ),
			$invoice['invoice_number']
		);

		$headers = [ 'Content-Type: text/html; charset=UTF-8' ];
		$body    = self::build_confirmed_email( $invoice );

		return wp_mail( $recipient, $subject, $body, $headers );
	}

	/**
	 * Wyślij notyfikację o otwarciu circuit breaker
	 *
	 * @param int    $credential_id ID kredencjału.
	 * @param int    $error_count Liczba błędów.
	 * @return bool
	 */
	public static function send_circuit_breaker_open( $credential_id, $error_count ) {
		global $wpdb;

		// Pobierz kredencjał
		$credential = $wpdb->get_row(
			$wpdb->prepare(
				"SELECT * FROM {$wpdb->prefix}gksef_credentials WHERE id = %d",
				$credential_id
			),
			ARRAY_A
		);

		if ( ! $credential ) {
			return false;
		}

		if ( ! self::are_notifications_enabled() ) {
			return false;
		}

		if ( ! get_option( 'gksef_email_notify_circuit_breaker', 1 ) ) {
			return false;
		}

		// Rate limiting
		if ( ! self::should_send_email( 'circuit_breaker', $credential_id ) ) {
			return false;
		}

		$recipient = self::get_email_recipient();
		$subject   = sprintf(
			// translators: %s = nazwa konta / NIP sprzedawcy
			__( '[KSEF] ⚠️ Circuit Breaker otwarty — %s', 'prostafaktura-ksef' ),
			$credential['nip']
		);

		$headers = [ 'Content-Type: text/html; charset=UTF-8' ];
		$body    = self::build_circuit_breaker_email( $credential, $error_count );

		$result = wp_mail( $recipient, $subject, $body, $headers );

		if ( $result ) {
			self::log_email_sent( 'circuit_breaker', $credential_id );
		}

		return $result;
	}

	/**
	 * Sprawdź czy powinno się wysłać email (rate limiting)
	 *
	 * @param string $type Typ notyfikacji (error, circuit_breaker, etc).
	 * @param int    $credential_id ID kredencjału.
	 * @return bool
	 */
	private static function should_send_email( $type, $credential_id ) {
		$rate_limit_minutes = intval( get_option( 'gksef_email_rate_limit_minutes', 10 ) );
		$last_sent_option   = "gksef_email_last_sent_{$type}_{$credential_id}";
		$last_sent          = get_option( $last_sent_option );

		if ( ! $last_sent ) {
			return true; // Pierwszy raz
		}

		$last_sent_time = intval( $last_sent );
		$now            = current_time( 'timestamp' );
		$diff_minutes   = ( $now - $last_sent_time ) / 60;

		return $diff_minutes >= $rate_limit_minutes;
	}

	/**
	 * Zaloguj wysłanie email'a (rate limiting)
	 *
	 * @param string $type Typ notyfikacji.
	 * @param int    $credential_id ID kredencjału.
	 * @return void
	 */
	private static function log_email_sent( $type, $credential_id ) {
		$last_sent_option = "gksef_email_last_sent_{$type}_{$credential_id}";
		update_option( $last_sent_option, current_time( 'timestamp' ), false );
	}

	/**
	 * Sprawdź czy notyfikacje są włączone
	 *
	 * @return bool
	 */
	private static function are_notifications_enabled() {
		return (bool) get_option( 'gksef_email_notifications_enabled', 1 );
	}

	/**
	 * Pobierz email odbiorcy
	 *
	 * @return string Email address
	 */
	private static function get_email_recipient() {
		$email = get_option( 'gksef_email_recipient' );

		if ( $email ) {
			return $email;
		}

		return get_option( 'admin_email' );
	}

	/**
	 * Zbuduj HTML email o błędzie
	 *
	 * @param array  $sync_log Dane logu.
	 * @param string $error_message Wiadomość błędu.
	 * @return string HTML
	 */
	private static function build_error_email( $sync_log, $error_message ) {
		$blog_name = get_bloginfo( 'name' );
		$admin_url = admin_url( 'admin.php?page=ksef-dashboard' );

		$html = '<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<style>
		body { font-family: Arial, sans-serif; color: #333; }
		.container { max-width: 600px; margin: 0 auto; padding: 20px; }
		.header { background: #990000; color: white; padding: 20px; border-radius: 4px; }
		.header h1 { margin: 0; }
		.content { background: #f5f5f5; padding: 20px; margin-top: 20px; border-radius: 4px; }
		.error-box { background: #ffcccc; padding: 15px; border-left: 4px solid #990000; margin: 15px 0; }
		.info-row { padding: 8px 0; border-bottom: 1px solid #ddd; }
		.info-label { font-weight: bold; color: #666; }
		.footer { text-align: center; margin-top: 30px; color: #999; font-size: 12px; }
		a { color: #0073aa; text-decoration: none; }
	</style>
</head>
<body>
	<div class="container">
		<div class="header">
			<h1>⚠️ Błąd synchronizacji KSeF</h1>
		</div>

		<div class="content">
			<p>Witaj,</p>
			<p>Nastąpił błąd podczas synchronizacji KSeF na stronie <strong>' . esc_html( $blog_name ) . '</strong>.</p>

			<div class="error-box">
				<strong>Typ błędu:</strong> ' . esc_html( ucfirst( $sync_log['sync_type'] ) ) . ' — ' . esc_html( ucfirst( $sync_log['sync_direction'] ) ) . '<br>
				<strong>Czas:</strong> ' . esc_html( date_i18n( 'Y-m-d H:i:s', strtotime( $sync_log['started_at'] ) ) ) . '<br>
				<strong>Wiadomość:</strong><br>
				<code style="background: white; padding: 10px; display: block; border-radius: 3px; margin-top: 10px;">' . esc_html( $error_message ) . '</code>
			</div>

			<div class="info-row">
				<span class="info-label">Okres synchronizacji:</span> ' . esc_html( $sync_log['date_from'] ) . ' → ' . esc_html( $sync_log['date_to'] ) . '
			</div>

			<div class="info-row">
				<span class="info-label">Przetworzono:</span> ' . intval( $sync_log['invoices_processed'] ) . ' faktur
			</div>

			<div class="info-row">
				<span class="info-label">Powodzenie:</span> ' . intval( $sync_log['invoices_success'] ) . ' / Błędy: ' . intval( $sync_log['invoices_failed'] ) . '
			</div>

			<p style="margin-top: 30px;">
				<a href="' . esc_url( $admin_url ) . '" style="background: #0073aa; color: white; padding: 10px 20px; border-radius: 4px; display: inline-block;">Przejdź do Monitoring</a>
			</p>

			<p style="color: #999; font-size: 12px; margin-top: 20px;">
				To jest automatycznie wygenerowana wiadomość. Prosimy nie odpowiadać na tego maila.
			</p>
		</div>

		<div class="footer">
			<p>' . esc_html( $blog_name ) . ' — KSEF WordPress Plugin</p>
		</div>
	</div>
</body>
</html>';

		return $html;
	}

	/**
	 * Zbuduj HTML email o potwierdzeniu faktury
	 *
	 * @param array $invoice Dane faktury.
	 * @return string HTML
	 */
	private static function build_confirmed_email( $invoice ) {
		$blog_name = get_bloginfo( 'name' );
		$admin_url = admin_url( 'admin.php?page=ksef-outgoing' );

		$html = '<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<style>
		body { font-family: Arial, sans-serif; color: #333; }
		.container { max-width: 600px; margin: 0 auto; padding: 20px; }
		.header { background: #006400; color: white; padding: 20px; border-radius: 4px; }
		.header h1 { margin: 0; }
		.content { background: #f5f5f5; padding: 20px; margin-top: 20px; border-radius: 4px; }
		.success-box { background: #ccf0dd; padding: 15px; border-left: 4px solid #006400; }
		.info-row { padding: 8px 0; border-bottom: 1px solid #ddd; }
		.info-label { font-weight: bold; color: #666; }
		.footer { text-align: center; margin-top: 30px; color: #999; font-size: 12px; }
		a { color: #0073aa; text-decoration: none; }
	</style>
</head>
<body>
	<div class="container">
		<div class="header">
			<h1>✅ Faktura potwierdzona</h1>
		</div>

		<div class="content">
			<p>Gratulacje!</p>
			<p>Faktura <strong>' . esc_html( $invoice['invoice_number'] ) . '</strong> została pomyślnie potwierdzona przez KSeF.</p>

			<div class="success-box">
				<strong>Nr faktury:</strong> ' . esc_html( $invoice['invoice_number'] ) . '<br>
				<strong>Kwota brutto:</strong> ' . esc_html( number_format_i18n( $invoice['gross_amount'], 2 ) ) . ' PLN<br>
				<strong>KSeF reference:</strong><br>
				<code>' . esc_html( $invoice['ksef_reference_number'] ) . '</code>
			</div>

			<div class="info-row" style="margin-top: 20px;">
				<span class="info-label">Data wystawienia:</span> ' . esc_html( date_i18n( 'Y-m-d H:i:s', strtotime( $invoice['created_at'] ) ) ) . '
			</div>

			<p style="margin-top: 30px;">
				<a href="' . esc_url( $admin_url ) . '" style="background: #0073aa; color: white; padding: 10px 20px; border-radius: 4px; display: inline-block;">Przeglądaj faktury</a>
			</p>
		</div>

		<div class="footer">
			<p>' . esc_html( $blog_name ) . ' — KSEF WordPress Plugin</p>
		</div>
	</div>
</body>
</html>';

		return $html;
	}

	/**
	 * Zbuduj HTML email o circuit breaker
	 *
	 * @param array $credential Dane kredencjału.
	 * @param int   $error_count Liczba błędów.
	 * @return string HTML
	 */
	private static function build_circuit_breaker_email( $credential, $error_count ) {
		$blog_name = get_bloginfo( 'name' );
		$admin_url = admin_url( 'admin.php?page=ksef-dashboard' );

		$html = '<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<style>
		body { font-family: Arial, sans-serif; color: #333; }
		.container { max-width: 600px; margin: 0 auto; padding: 20px; }
		.header { background: #cc6600; color: white; padding: 20px; border-radius: 4px; }
		.header h1 { margin: 0; }
		.content { background: #f5f5f5; padding: 20px; margin-top: 20px; border-radius: 4px; }
		.alert-box { background: #fff8dc; padding: 15px; border-left: 4px solid #cc6600; }
		.info-row { padding: 8px 0; border-bottom: 1px solid #ddd; }
		.info-label { font-weight: bold; color: #666; }
		.footer { text-align: center; margin-top: 30px; color: #999; font-size: 12px; }
		a { color: #0073aa; text-decoration: none; }
	</style>
</head>
<body>
	<div class="container">
		<div class="header">
			<h1>🔴 Circuit Breaker otwarty</h1>
		</div>

		<div class="content">
			<p>Uwaga!</p>
			<p>Circuit breaker dla kredencjału KSeF został <strong>otwarty</strong> ze względu na zbyt wiele błędów.</p>

			<div class="alert-box">
				<strong>NIP:</strong> ' . esc_html( $credential['nip'] ) . '<br>
				<strong>Liczba błędów:</strong> ' . intval( $error_count ) . '<br>
				<strong>Status:</strong> Pause aktywny na 5 minut<br>
				<strong>Akcja:</strong> Synchronizacja zostanie wznowiona automatycznie po upłynięciu czasu pausy.
			</div>

			<p style="margin-top: 20px; color: #666;">
				To może wskazywać na:
				<ul>
					<li>Problemy z połączeniem do API KSeF</li>
					<li>Nieprawidłowe dane kredencjału</li>
					<li>Zmianę w strukturze API</li>
				</ul>
			</p>

			<p style="margin-top: 30px;">
				<a href="' . esc_url( $admin_url ) . '" style="background: #cc6600; color: white; padding: 10px 20px; border-radius: 4px; display: inline-block;">Przejdź do Monitoring</a>
			</p>
		</div>

		<div class="footer">
			<p>' . esc_html( $blog_name ) . ' — KSEF WordPress Plugin</p>
		</div>
	</div>
</body>
</html>';

		return $html;
	}

	/**
	 * Powiadomienie admina o NIEUDANEJ automatycznej wysyłce faktury do KSeF.
	 *
	 * @param \WC_Order $order Zamówienie.
	 * @param string    $error_message Treść błędu.
	 * @param string    $invoice_number Zarezerwowany numer faktury.
	 * @return bool
	 */
	public static function send_invoice_send_failed( $order, $error_message, $invoice_number = '' ) {
		if ( ! ( $order instanceof \WC_Order ) ) {
			return false;
		}
		if ( ! self::are_notifications_enabled() ) {
			return false;
		}
		if ( ! get_option( 'gksef_email_notify_errors', 1 ) ) {
			return false;
		}
		$order_id = (int) $order->get_id();
		// Rate limiting per zamówienie — nie spamuj przy wielokrotnych próbach.
		if ( ! self::should_send_email( 'invoice_failed', $order_id ) ) {
			return false;
		}
		$recipient = self::get_email_recipient();
		$subject   = sprintf(
			// translators: %s = numer zamówienia
			__( '[KSEF] ⚠️ Faktura NIE została wysłana do KSeF — zamówienie #%s', 'prostafaktura-ksef' ),
			$order_id
		);
		$headers = [ 'Content-Type: text/html; charset=UTF-8' ];
		$body    = self::build_invoice_failed_email( $order, (string) $error_message, (string) $invoice_number );
		$result  = wp_mail( $recipient, $subject, $body, $headers );
		if ( $result ) {
			self::log_email_sent( 'invoice_failed', $order_id );
		}
		return $result;
	}

	/**
	 * Zbuduj HTML email o nieudanej wysyłce faktury do KSeF.
	 *
	 * @param \WC_Order $order Zamówienie.
	 * @param string    $error_message Treść błędu.
	 * @param string    $invoice_number Zarezerwowany numer faktury.
	 * @return string HTML
	 */
	private static function build_invoice_failed_email( $order, $error_message, $invoice_number ) {
		$blog_name = get_bloginfo( 'name' );
		$order_id  = (int) $order->get_id();
		$edit_url  = method_exists( $order, 'get_edit_order_url' ) ? $order->get_edit_order_url() : admin_url( 'post.php?post=' . $order_id . '&action=edit' );
		$num_row   = '' !== $invoice_number
			? '<strong>Zarezerwowany numer:</strong> ' . esc_html( $invoice_number ) . ' (użyty ponownie przy „Ponów wysyłkę" — bez dziury w numeracji)<br>'
			: '';
		$buyer = trim( (string) $order->get_billing_company() );
		if ( '' === $buyer ) {
			$buyer = trim( (string) $order->get_formatted_billing_full_name() );
		}

		return '<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<style>
		body { font-family: Arial, sans-serif; color: #333; }
		.container { max-width: 600px; margin: 0 auto; padding: 20px; }
		.header { background: #990000; color: white; padding: 20px; border-radius: 4px; }
		.header h1 { margin: 0; font-size: 20px; }
		.content { background: #f5f5f5; padding: 20px; margin-top: 20px; border-radius: 4px; }
		.error-box { background: #ffcccc; padding: 15px; border-left: 4px solid #990000; margin: 15px 0; }
		.footer { text-align: center; margin-top: 30px; color: #999; font-size: 12px; }
	</style>
</head>
<body>
	<div class="container">
		<div class="header"><h1>⚠️ Faktura NIE została wysłana do KSeF</h1></div>
		<div class="content">
			<p>Automatyczne wystawienie faktury dla zamówienia <strong>#' . esc_html( (string) $order_id ) . '</strong> na stronie <strong>' . esc_html( $blog_name ) . '</strong> nie powiodło się.</p>
			<div class="error-box">
				' . $num_row . '
				<strong>Nabywca:</strong> ' . esc_html( $buyer ) . '<br>
				<strong>Kwota brutto:</strong> ' . esc_html( number_format_i18n( (float) $order->get_total(), 2 ) ) . ' ' . esc_html( (string) $order->get_currency() ) . '<br>
				<strong>Błąd:</strong><br>
				<code style="background: white; padding: 10px; display: block; border-radius: 3px; margin-top: 10px;">' . esc_html( $error_message ) . '</code>
			</div>
			<p><strong>Co zrobić:</strong> usuń przyczynę błędu (np. odśwież/popraw token KSeF), następnie otwórz zamówienie i kliknij <strong>„Ponów wysyłkę"</strong> w sekcji „KSeF — faktura". Numer faktury zostanie użyty ponownie.</p>
			<p style="margin-top: 24px;">
				<a href="' . esc_url( $edit_url ) . '" style="background: #0073aa; color: white; padding: 10px 20px; border-radius: 4px; display: inline-block; text-decoration:none;">Otwórz zamówienie #' . esc_html( (string) $order_id ) . '</a>
			</p>
		</div>
		<div class="footer"><p>' . esc_html( $blog_name ) . ' — KSEF WordPress Plugin</p></div>
	</div>
</body>
</html>';
	}
}
