<?php
/**
 * Abstract Gateway
 *
 * Hanldes generic payment gateway functionality which is extended by idividual payment gateways.
 */
abstract class WPBDP__Payment_Gateway {

	public function __construct() {
	}

	abstract public function get_id();
	abstract public function get_title();

	public function get_logo() {
		return $this->get_title();
	}

	public function enqueue_scripts() {
	}

	public function is_enabled( $no_errors = true ) {
		$setting_on = wpbdp_get_option( $this->get_id() );
		if ( ! $no_errors ) {
			return $setting_on;
		}

		return $setting_on && ! $this->validate_settings();
	}

	public function in_test_mode() {
		return wpbdp_get_option( 'payments-test-mode' );
	}

	public function get_option( $key ) {
		return wpbdp_get_option( $this->get_id() . '-' . $key );
	}

	abstract public function get_integration_method();

	public function supports( $feature ) {
		return false;
	}

	public function supports_currency( $currency ) {
		return false;
	}

	public function get_settings() {
		return array();
	}

	public function get_settings_text() {
		return '';
	}

	public function validate_settings() {
		return array();
	}

	public function process_payment( $payment ) {
		return false;
	}

	public function process_postback() {
	}

	public function refund( $payment, $data = array() ) {
	}

	public function render_form( $payment, $errors = array() ) {
		$vars = array();

		$vars['data'] = $_POST;

		foreach ( $payment->get_payer_details() as $k => $v ) {
			if ( empty( $_POST[ 'payer_' . $k ] ) && ! empty( $v ) ) {
				$vars['data'][ 'payer_' . $k ] = $v;
			}
		}

		$vars['gateway'] = $this;
		$vars['errors']  = $errors;
		$vars['payment'] = $payment;

		if ( $this->skip_payment_form( $payment ) ) {
			$vars['show_cc_section']      = false;
			$vars['show_details_section'] = false;
		}

		return wpbdp_x_render( 'checkout-billing-form', $vars );
	}

	public function validate_form( $payment ) {
		$errors = array();

		$required = array( 'payer_email', 'payer_first_name' );
		if ( ! $this->skip_payment_form( $payment ) ) {
			$required = array_merge( $required, array( 'card_number', 'cvc', 'card_name', 'exp_month', 'exp_year', 'payer_address', 'payer_city', 'payer_zip', 'payer_country' ) );
		}

		foreach ( $required as $req_field ) {
			$field_value = wpbdp_get_var( array( 'param' => $req_field ), 'post' );

			if ( ! $field_value ) {
				$errors[ $req_field ] = sprintf(
					/* translators: %s: field name */
					__( 'This field is required (%s).', 'business-directory-plugin' ),
					$req_field
				);
			}
		}

		return $errors;
	}

	/**
	 * @since 5.13.2
	 */
	private function skip_payment_form( $payment ) {
		return 'form' === $this->get_integration_method() || $payment->amount === '0.00';
	}

	/**
	 * @param object $payment
	 *
	 * @return void
	 */
	public function save_billing_data( $payment ) {
		$form = $_POST;

		foreach ( array( 'payer_email', 'payer_first_name', 'payer_last_name' ) as $k ) {
			if ( ! empty( $form[ $k ] ) ) {
				$payment->{$k} = $form[ $k ];
			}
		}

		if ( ! empty( $form['payer_address'] ) ) {
			$payment->payer_data['address'] = $form['payer_address'];
		}

		if ( ! empty( $form['payer_address_2'] ) ) {
			$payment->payer_data['address_2'] = $form['payer_address_2'];
		}

		if ( ! empty( $form['payer_city'] ) ) {
			$payment->payer_data['city'] = $form['payer_city'];
		}

		if ( ! empty( $form['payer_state'] ) ) {
			$payment->payer_data['state'] = $form['payer_state'];
		}

		if ( ! empty( $form['payer_zip'] ) ) {
			$payment->payer_data['zip'] = $form['payer_zip'];
		}

		if ( ! empty( $form['payer_country'] ) ) {
			$payment->payer_data['country'] = $form['payer_country'];
		}

		$payment->save();
	}

	public function get_listener_url() {
		return add_query_arg( 'wpbdp-listener', $this->get_id(), home_url( 'index.php' ) );
	}

	/**
	 * Override this in the individual gateway class.
	 *
	 * @since 5.11
	 */
	public function get_payment_link( $payment ) {
		return '';
	}

	public function cancel_subscription( $listing, $subscription ) {
		$message = __(
			'There was an unexpected error canceling your subscription. Please contact the website administrator and they should be able to cancel your subscription by contacting the payment processor directly.',
			'business-directory-plugin'
		);
		throw new Exception( esc_html( $message ) );
	}
}
