<?php
/**
 * Equalza_Billing — Core billing logic with Green Invoice API integration.
 *
 * Handles subscriptions, checkout, proration, webhook processing,
 * and daily cron for expired subscription cleanup.
 */
defined( 'ABSPATH' ) || exit;

class Equalza_Billing {

	/** Green Invoice API base */
	private const GI_API = 'https://api.greeninvoice.co.il/api/v1';

	/** JWT token transient */
	private const TOKEN_TRANSIENT = 'equalza_gi_jwt';
	private const TOKEN_TTL       = 3300; // 55 min (tokens last 60 min)

	/** Plans */
	const PLAN_MONTHLY = 'pro_monthly';
	const PLAN_ANNUAL  = 'pro_annual';

	const PRICES = [
		'pro_monthly' => [ 'cents' => 700,  'label' => '$7/mo' ],
		'pro_annual'  => [ 'cents' => 7200, 'label' => '$72/yr' ],
	];

	/** Cron hook */
	private const CRON_HOOK = 'equalza_billing_daily_check';

	/* ── Init ──────────────────────────────────────────────────────────── */

	public static function init(): void {
		// Schedule daily cron if not already scheduled.
		if ( ! wp_next_scheduled( self::CRON_HOOK ) ) {
			wp_schedule_event( time(), 'daily', self::CRON_HOOK );
		}
		add_action( self::CRON_HOOK, [ __CLASS__, 'check_expired_subscriptions' ] );
	}

	/* ── Green Invoice API Auth ────────────────────────────────────────── */

	/**
	 * Get a cached JWT token from Green Invoice.
	 */
	private static function get_gi_token(): ?string {
		$cached = get_transient( self::TOKEN_TRANSIENT );
		if ( $cached ) {
			return $cached;
		}

		$api_key    = get_option( 'equalza_gi_api_key', '' );
		$api_secret = get_option( 'equalza_gi_api_secret', '' );

		if ( empty( $api_key ) || empty( $api_secret ) ) {
			error_log( '[equalza-billing] gi_error: API key or secret not configured.' );
			return null;
		}

		$response = wp_remote_post( self::GI_API . '/account/token', [
			'headers' => [ 'Content-Type' => 'application/json' ],
			'body'    => wp_json_encode( [
				'id'     => $api_key,
				'secret' => $api_secret,
			] ),
			'timeout' => 15,
		] );

		if ( is_wp_error( $response ) ) {
			error_log( '[equalza-billing] gi_error: ' . $response->get_error_message() );
			return null;
		}

		$body = json_decode( wp_remote_retrieve_body( $response ), true );
		$jwt  = $body['token'] ?? '';

		if ( empty( $jwt ) ) {
			error_log( '[equalza-billing] gi_error: empty token response.' );
			return null;
		}

		set_transient( self::TOKEN_TRANSIENT, $jwt, self::TOKEN_TTL );
		return $jwt;
	}

	/**
	 * Make an authenticated request to the Green Invoice API.
	 */
	private static function gi_request( string $method, string $endpoint, array $body = [] ): ?array {
		$token = self::get_gi_token();
		if ( ! $token ) {
			return null;
		}

		$args = [
			'method'  => $method,
			'headers' => [
				'Authorization' => 'Bearer ' . $token,
				'Content-Type'  => 'application/json',
			],
			'timeout' => 15,
		];

		if ( ! empty( $body ) ) {
			$args['body'] = wp_json_encode( $body );
		}

		$response = wp_remote_request( self::GI_API . $endpoint, $args );

		if ( is_wp_error( $response ) ) {
			error_log( '[equalza-billing] gi_request_error: ' . $response->get_error_message() );
			return null;
		}

		$code = (int) wp_remote_retrieve_response_code( $response );
		$data = json_decode( wp_remote_retrieve_body( $response ), true );

		if ( $code >= 400 ) {
			error_log( '[equalza-billing] gi_api_error: HTTP ' . $code . ' — ' . wp_json_encode( $data ) );
			return null;
		}

		return $data;
	}

	/* ── Checkout / Payment Page ───────────────────────────────────────── */

	/**
	 * Create a Green Invoice payment page and return its URL.
	 */
	public static function create_checkout( int $user_id, string $plan ): array {
		if ( ! isset( self::PRICES[ $plan ] ) ) {
			return [ 'success' => false, 'code' => 'invalid_plan' ];
		}

		// Check if user already has an active subscription.
		$existing = self::get_subscription( $user_id );
		if ( $existing && in_array( $existing['status'], [ 'active', 'past_due' ], true ) ) {
			return [ 'success' => false, 'code' => 'already_subscribed' ];
		}

		$user = get_userdata( $user_id );
		if ( ! $user ) {
			return [ 'success' => false, 'code' => 'invalid_user' ];
		}

		// Calculate price (prorate for monthly).
		$price_cents = self::calculate_price( $plan );
		$price       = $price_cents / 100;

		$lang     = get_user_meta( $user_id, 'equalza_lang', true ) ?: 'en';
		$doc_lang = in_array( $lang, [ 'he', 'ar' ], true ) ? 'he' : 'en';

		$description = $plan === self::PLAN_ANNUAL
			? 'Equalza Pro — Annual Subscription'
			: 'Equalza Pro — Monthly Subscription';

		$plugin_id = get_option( 'equalza_gi_plugin_id', '971eecf2-59fd-47f1-9910-9fef228e55e6' );

		$payment_data = [
			'type'        => 320,
			'lang'        => $doc_lang,
			'currency'    => 'USD',
			'vatType'     => 2,
			'amount'      => $price,
			'maxPayments' => 1,
			'pluginId'    => $plugin_id,
			'group'       => 100,
			'description' => $description,
			'client'      => [
				'name'    => $user->display_name ?: $user->user_email,
				'emails'  => [ $user->user_email ],
			],
			'remarks'     => 'user_id:' . $user_id . '|plan:' . $plan,
			'successUrl'  => home_url( '/profile/?billing=success&plan=' . $plan ),
			'failureUrl'  => home_url( '/profile/?billing=failed' ),
		];

		error_log( '[equalza-billing] checkout_request: ' . wp_json_encode( $payment_data ) );

		$result = self::gi_request( 'POST', '/payments/form', $payment_data );

		if ( ! $result || empty( $result['url'] ) ) {
			error_log( '[equalza-billing] checkout_error: Failed to create payment form. Response: ' . wp_json_encode( $result ) );
			return [ 'success' => false, 'code' => 'checkout_error' ];
		}

		$pay_url = $result['url'];

		error_log( '[equalza-billing] checkout_success: url=' . $pay_url );

		return [
			'success'      => true,
			'checkout_url' => $pay_url,
		];
	}

	/* ── Price Calculation ─────────────────────────────────────────────── */

	/**
	 * Calculate price in cents, with proration for monthly plans.
	 */
	public static function calculate_price( string $plan ): int {
		if ( $plan === self::PLAN_ANNUAL ) {
			return self::PRICES[ self::PLAN_ANNUAL ]['cents']; // $72
		}

		// Monthly: prorate based on remaining days in month.
		$now            = new \DateTimeImmutable( 'now', new \DateTimeZone( 'UTC' ) );
		$day            = (int) $now->format( 'j' );
		$days_in_month  = (int) $now->format( 't' );

		// If subscribing on the 1st, no proration needed.
		if ( $day === 1 ) {
			return self::PRICES[ self::PLAN_MONTHLY ]['cents']; // $7
		}

		$remaining = $days_in_month - $day + 1;
		$daily     = self::PRICES[ self::PLAN_MONTHLY ]['cents'] / $days_in_month;
		$prorated  = (int) round( $daily * $remaining );

		return max( $prorated, 100 ); // Minimum $1.00
	}

	/* ── Subscription CRUD ─────────────────────────────────────────────── */

	/**
	 * Get the current subscription for a user.
	 */
	public static function get_subscription( int $user_id ): ?array {
		global $wpdb;
		$table = Equalza_Billing_Schema::table( 'subscriptions' );

		// phpcs:ignore WordPress.DB.DirectDatabaseQuery
		$row = $wpdb->get_row( $wpdb->prepare(
			"SELECT * FROM {$table} WHERE user_id = %d",
			$user_id
		), ARRAY_A );

		return $row ?: null;
	}

	/**
	 * Activate a subscription after successful payment.
	 */
	public static function activate_subscription( int $user_id, string $plan, string $gi_customer_id = '', string $gi_subscription_id = '' ): void {
		global $wpdb;
		$table = Equalza_Billing_Schema::table( 'subscriptions' );
		$now   = gmdate( 'Y-m-d H:i:s' );

		$price_cents = self::PRICES[ $plan ]['cents'] ?? 700;

		// Calculate period end.
		if ( $plan === self::PLAN_ANNUAL ) {
			$period_end = gmdate( 'Y-m-d H:i:s', strtotime( '+1 year', time() ) );
		} else {
			// End on the 1st of next month.
			$next_first = gmdate( 'Y-m-01 00:00:00', strtotime( 'first day of next month' ) );
			$period_end = $next_first;
		}

		$existing = self::get_subscription( $user_id );

		if ( $existing ) {
			// Update existing row.
			// phpcs:ignore WordPress.DB.DirectDatabaseQuery
			$wpdb->update( $table, [
				'plan'                 => $plan,
				'status'               => 'active',
				'gi_customer_id'       => $gi_customer_id,
				'gi_subscription_id'   => $gi_subscription_id,
				'price_cents'          => $price_cents,
				'current_period_start' => $now,
				'current_period_end'   => $period_end,
				'cancelled_at'         => null,
				'updated_at'           => $now,
			], [ 'user_id' => $user_id ] );
		} else {
			// Insert new row.
			// phpcs:ignore WordPress.DB.DirectDatabaseQuery
			$wpdb->insert( $table, [
				'user_id'              => $user_id,
				'plan'                 => $plan,
				'status'               => 'active',
				'gi_customer_id'       => $gi_customer_id,
				'gi_subscription_id'   => $gi_subscription_id,
				'price_cents'          => $price_cents,
				'currency'             => 'USD',
				'current_period_start' => $now,
				'current_period_end'   => $period_end,
				'created_at'           => $now,
				'updated_at'           => $now,
			] );
		}

		// Set the fast-check user meta.
		update_user_meta( $user_id, 'equalza_pro', '1' );
	}

	/**
	 * Extend a subscription period (for recurring payments).
	 */
	public static function extend_subscription( int $user_id ): void {
		global $wpdb;
		$table = Equalza_Billing_Schema::table( 'subscriptions' );
		$sub   = self::get_subscription( $user_id );
		$now   = gmdate( 'Y-m-d H:i:s' );

		if ( ! $sub ) {
			return;
		}

		if ( $sub['plan'] === self::PLAN_ANNUAL ) {
			$new_end = gmdate( 'Y-m-d H:i:s', strtotime( '+1 year', strtotime( $sub['current_period_end'] ) ) );
		} else {
			$new_end = gmdate( 'Y-m-d H:i:s', strtotime( '+1 month', strtotime( $sub['current_period_end'] ) ) );
		}

		// phpcs:ignore WordPress.DB.DirectDatabaseQuery
		$wpdb->update( $table, [
			'status'               => 'active',
			'current_period_start' => $sub['current_period_end'],
			'current_period_end'   => $new_end,
			'updated_at'           => $now,
		], [ 'user_id' => $user_id ] );

		update_user_meta( $user_id, 'equalza_pro', '1' );
	}

	/**
	 * Cancel a subscription (effective at end of period).
	 */
	public static function cancel_subscription( int $user_id ): array {
		global $wpdb;
		$table = Equalza_Billing_Schema::table( 'subscriptions' );
		$sub   = self::get_subscription( $user_id );

		if ( ! $sub || $sub['status'] !== 'active' ) {
			return [ 'success' => false, 'code' => 'no_active_subscription' ];
		}

		$now = gmdate( 'Y-m-d H:i:s' );

		// phpcs:ignore WordPress.DB.DirectDatabaseQuery
		$wpdb->update( $table, [
			'status'       => 'cancelled',
			'cancelled_at' => $now,
			'updated_at'   => $now,
		], [ 'user_id' => $user_id ] );

		// Pro access continues until current_period_end.
		return [ 'success' => true, 'access_until' => $sub['current_period_end'] ];
	}

	/**
	 * Reactivate a cancelled subscription (before it expires).
	 */
	public static function reactivate_subscription( int $user_id ): array {
		global $wpdb;
		$table = Equalza_Billing_Schema::table( 'subscriptions' );
		$sub   = self::get_subscription( $user_id );

		if ( ! $sub || $sub['status'] !== 'cancelled' ) {
			return [ 'success' => false, 'code' => 'not_cancelled' ];
		}

		// Check the period hasn't ended.
		if ( strtotime( $sub['current_period_end'] ) < time() ) {
			return [ 'success' => false, 'code' => 'period_expired' ];
		}

		$now = gmdate( 'Y-m-d H:i:s' );

		// phpcs:ignore WordPress.DB.DirectDatabaseQuery
		$wpdb->update( $table, [
			'status'       => 'active',
			'cancelled_at' => null,
			'updated_at'   => $now,
		], [ 'user_id' => $user_id ] );

		update_user_meta( $user_id, 'equalza_pro', '1' );

		return [ 'success' => true ];
	}

	/* ── Payment Logging ───────────────────────────────────────────────── */

	/**
	 * Log a payment record.
	 */
	public static function log_payment( array $data ): int {
		global $wpdb;
		$table = Equalza_Billing_Schema::table( 'payments' );

		// phpcs:ignore WordPress.DB.DirectDatabaseQuery
		$wpdb->insert( $table, [
			'user_id'            => $data['user_id'],
			'subscription_id'    => $data['subscription_id'] ?? 0,
			'gi_document_id'     => $data['gi_document_id'] ?? '',
			'gi_payment_id'      => $data['gi_payment_id'] ?? '',
			'type'               => $data['type'] ?? 'charge',
			'amount_cents'       => $data['amount_cents'] ?? 0,
			'currency'           => $data['currency'] ?? 'USD',
			'status'             => $data['status'] ?? 'succeeded',
			'invoice_url'        => $data['invoice_url'] ?? '',
			'description'        => $data['description'] ?? '',
			'gi_webhook_payload' => $data['gi_webhook_payload'] ?? null,
			'created_at'         => gmdate( 'Y-m-d H:i:s' ),
		] );

		return (int) $wpdb->insert_id;
	}

	/**
	 * Get payment history for a user.
	 */
	public static function get_payments( int $user_id, int $limit = 20 ): array {
		global $wpdb;
		$table = Equalza_Billing_Schema::table( 'payments' );

		// phpcs:ignore WordPress.DB.DirectDatabaseQuery
		return $wpdb->get_results( $wpdb->prepare(
			"SELECT id, type, amount_cents, currency, status, invoice_url, description, created_at
			 FROM {$table}
			 WHERE user_id = %d
			 ORDER BY created_at DESC
			 LIMIT %d",
			$user_id,
			$limit
		), ARRAY_A ) ?: [];
	}

	/* ── Webhook Processing ────────────────────────────────────────────── */

	/**
	 * Process a payment/received webhook event.
	 */
	public static function process_payment_received( array $payload ): void {
		$doc = $payload['data'] ?? $payload;

		// Extract user from remarks field: "user_id:123|plan:pro_monthly"
		$remarks  = $doc['remarks'] ?? '';
		$user_id  = 0;
		$plan     = self::PLAN_MONTHLY;

		if ( preg_match( '/user_id:(\d+)/', $remarks, $m ) ) {
			$user_id = (int) $m[1];
		}
		if ( preg_match( '/plan:([\w]+)/', $remarks, $m ) ) {
			$plan = $m[1];
		}

		// Fallback: look up by email.
		if ( ! $user_id ) {
			$emails = $doc['client']['emails'] ?? [];
			$email  = $emails[0] ?? ( $doc['client']['email'] ?? '' );
			if ( $email ) {
				$wp_user = get_user_by( 'email', $email );
				if ( $wp_user ) {
					$user_id = $wp_user->ID;
				}
			}
		}

		if ( ! $user_id ) {
			error_log( '[equalza-billing] webhook_error: could not identify user. Payload: ' . wp_json_encode( $doc ) );
			return;
		}

		// Deduplicate by gi_document_id.
		$doc_id = (string) ( $doc['id'] ?? '' );
		if ( $doc_id ) {
			global $wpdb;
			$table    = Equalza_Billing_Schema::table( 'payments' );
			$existing = $wpdb->get_var( $wpdb->prepare(
				"SELECT id FROM {$table} WHERE gi_document_id = %s",
				$doc_id
			) );
			if ( $existing ) {
				return; // Already processed.
			}
		}

		// Activate or extend subscription.
		$sub = self::get_subscription( $user_id );
		if ( $sub && $sub['status'] === 'active' ) {
			self::extend_subscription( $user_id );
		} else {
			self::activate_subscription(
				$user_id,
				$plan,
				(string) ( $doc['client']['id'] ?? '' ),
				''
			);
		}

		// Get subscription ID for logging.
		$sub = self::get_subscription( $user_id );

		// Log the payment.
		$amount = isset( $doc['total'] ) ? (int) round( (float) $doc['total'] * 100 ) : self::PRICES[ $plan ]['cents'];

		self::log_payment( [
			'user_id'            => $user_id,
			'subscription_id'    => $sub['id'] ?? 0,
			'gi_document_id'     => $doc_id,
			'gi_payment_id'      => (string) ( $doc['payment']['id'] ?? '' ),
			'type'               => 'charge',
			'amount_cents'       => $amount,
			'status'             => 'succeeded',
			'invoice_url'        => $doc['url'] ?? ( $doc['shareLink'] ?? '' ),
			'description'        => $doc['description'] ?? '',
			'gi_webhook_payload' => wp_json_encode( $payload ),
		] );
	}

	/**
	 * Process a sale-pages/order-paid webhook event.
	 */
	public static function process_order_paid( array $payload ): void {
		// Same processing logic — delegate.
		self::process_payment_received( $payload );
	}

	/* ── Cron: Expired Subscriptions ───────────────────────────────────── */

	/**
	 * Daily check for expired subscriptions.
	 */
	public static function check_expired_subscriptions(): void {
		global $wpdb;
		$table = Equalza_Billing_Schema::table( 'subscriptions' );
		$now   = gmdate( 'Y-m-d H:i:s' );

		// Active subscriptions past their period end.
		// phpcs:ignore WordPress.DB.DirectDatabaseQuery
		$expired = $wpdb->get_col( $wpdb->prepare(
			"SELECT user_id FROM {$table} WHERE status IN ('active', 'cancelled') AND current_period_end < %s",
			$now
		) );

		foreach ( $expired as $uid ) {
			$uid = (int) $uid;
			// phpcs:ignore WordPress.DB.DirectDatabaseQuery
			$wpdb->update( $table, [
				'status'     => 'expired',
				'updated_at' => $now,
			], [ 'user_id' => $uid ] );

			delete_user_meta( $uid, 'equalza_pro' );
		}

		// Past-due subscriptions with 3-day grace period expired.
		$grace_cutoff = gmdate( 'Y-m-d H:i:s', strtotime( '-3 days' ) );
		// phpcs:ignore WordPress.DB.DirectDatabaseQuery
		$past_due = $wpdb->get_col( $wpdb->prepare(
			"SELECT user_id FROM {$table} WHERE status = 'past_due' AND current_period_end < %s",
			$grace_cutoff
		) );

		foreach ( $past_due as $uid ) {
			$uid = (int) $uid;
			// phpcs:ignore WordPress.DB.DirectDatabaseQuery
			$wpdb->update( $table, [
				'status'     => 'expired',
				'updated_at' => $now,
			], [ 'user_id' => $uid ] );

			delete_user_meta( $uid, 'equalza_pro' );
		}

		if ( count( $expired ) + count( $past_due ) > 0 ) {
			error_log( '[equalza-billing] cron: expired ' . count( $expired ) . ' subscriptions, ' . count( $past_due ) . ' past-due.' );
		}
	}

	/* ── Account Deletion Cleanup ──────────────────────────────────────── */

	/**
	 * Clean up billing data when a user account is deleted.
	 */
	public static function cleanup_user( int $user_id ): void {
		global $wpdb;

		$subs     = Equalza_Billing_Schema::table( 'subscriptions' );
		$payments = Equalza_Billing_Schema::table( 'payments' );

		// phpcs:ignore WordPress.DB.DirectDatabaseQuery
		$wpdb->delete( $subs, [ 'user_id' => $user_id ] );
		// phpcs:ignore WordPress.DB.DirectDatabaseQuery
		$wpdb->delete( $payments, [ 'user_id' => $user_id ] );
	}

	/* ── Helpers ───────────────────────────────────────────────────────── */

	/**
	 * Check if a user has an active Pro subscription.
	 */
	public static function is_pro( int $user_id ): bool {
		return get_user_meta( $user_id, 'equalza_pro', true ) === '1';
	}

	/**
	 * Format cents to display string.
	 */
	public static function format_amount( int $cents, string $currency = 'USD' ): string {
		return '$' . number_format( $cents / 100, 2 );
	}
}
