<?php
if ( ! defined( 'ABSPATH' ) ) {
	die( 'You are not allowed to call this page directly.' );
}

class FrmFormTemplateApi extends FrmFormApi {

	protected static $code_option_name  = 'frm_free_license_code';

	private static $base_api_url = 'https://formidableforms.com/wp-json/form-templates/v1/';

	protected static $free_license;

	/**
	 * @var int $new_days
	 */
	protected $new_days = 30;

	/**
	 * @since 3.06
	 *
	 * @return void
	 */
	protected function set_cache_key() {
		$this->cache_key = 'frm_form_templates_l';

		if ( ! empty( $this->license ) ) {
			$this->cache_key .= md5( $this->license );
		} else {
			$free_license = $this->get_free_license();
			if ( $free_license ) {
				$this->cache_key .= md5( $free_license );
			}
		}
	}

	/**
	 * @since 3.06
	 *
	 * @return string
	 */
	protected function api_url() {
		$url = self::$base_api_url . 'list';

		if ( empty( $this->license ) ) {
			$free_license = $this->get_free_license();

			if ( $free_license ) {
				$url .= '?l=' . urlencode( base64_encode( $free_license ) );
				$url .= '&v=' . FrmAppHelper::plugin_version();
			}
		}

		return $url;
	}

	/**
	 * @since 3.06
	 *
	 * @return array
	 */
	protected function skip_categories() {
		return array();
	}

	/**
	 * @return string
	 */
	public function get_free_license() {
		if ( ! isset( self::$free_license ) ) {
			self::$free_license = get_option( self::$code_option_name );
		}

		return self::$free_license;
	}

	/**
	 * Check to make sure the free code is being used.
	 *
	 * @since 4.09.02
	 *
	 * @return bool
	 */
	public function has_free_access() {
		$free_access = $this->get_free_license();
		if ( ! $free_access ) {
			return false;
		}

		$templates    = $this->get_api_info();
		$contact_form = 20872734;
		return isset( $templates[ $contact_form ] ) && ! empty( $templates[ $contact_form ]['url'] );
	}

	/**
	 * @param string $code the code from the email sent for the API
	 *
	 * @return void
	 */
	private static function verify_code( $code ) {
		$base64_code = base64_encode( $code );
		$api_url     = self::$base_api_url . 'code?l=' . urlencode( $base64_code );
		$response    = wp_remote_get( $api_url );

		self::handle_verify_response_errors_if_any( $response );

		$decoded    = json_decode( $response['body'] );
		$successful = ! empty( $decoded->response );

		if ( $successful ) {
			self::on_api_verify_code_success( $code );
		} else {
			wp_send_json_error( new WP_Error( $decoded->code, $decoded->message ) );
		}
	}

	/**
	 * @return void
	 */
	private static function clear_template_cache_before_getting_free_templates() {
		delete_option( 'frm_form_templates_l' );
	}

	/**
	 * @param array $response
	 *
	 * @return void
	 */
	private static function handle_verify_response_errors_if_any( $response ) {
		if ( is_wp_error( $response ) ) {
			wp_send_json_error( $response );
		}

		if ( ! is_array( $response ) ) {
			wp_send_json_error();
		}
	}

	/**
	 * @param string $code the base64 encoded code
	 *
	 * @return void
	 */
	private static function on_api_verify_code_success( $code ) {
		self::$free_license = $code;
		update_option( self::$code_option_name, $code, 'no' );

		$data = array();
		$key  = FrmAppHelper::get_param( 'key', '', 'post', 'sanitize_key' );

		// Remove message from Inbox page.
		$message = new FrmInbox();
		$message->remove( 'free_templates' );

		if ( $key ) {
			self::clear_template_cache_before_getting_free_templates();

			$data['urlByKey'] = array();
			$api              = new self();
			$templates        = $api->get_api_info();

			foreach ( $templates as $template ) {
				if ( ! isset( $template['url'] ) || ! in_array( 'free', $template['categories'], true ) ) {
					continue;
				}

				$data['urlByKey'][ $template['key'] ] = $template['url'];
			}

			if ( ! isset( $data['urlByKey'][ $key ] ) ) {
				$error = new WP_Error( 400, 'We were unable to retrieve the template' );
				wp_send_json_error( $error );
			}

			$data['url'] = $data['urlByKey'][ $key ];
		}

		wp_send_json_success( $data );
	}

	/**
	 * AJAX Hook for signing free users up for a template API key
	 *
	 * @return void
	 */
	public static function signup() {
		$code = FrmAppHelper::get_param( 'code', '', 'post' );

		if ( ! $code ) {
			wp_send_json_error();
		}

		self::verify_code( $code );
	}
}
