<?php

namespace Stripe\StripeTaxForWooCommerce\SDK\lib;

abstract class Webhook {

	const DEFAULT_TOLERANCE = 300;

	/**
	 * Returns an Event instance using the provided JSON payload. Throws an
	 * Exception\UnexpectedValueException if the payload is not valid JSON, and
	 * an Exception\SignatureVerificationException if the signature
	 * verification fails for any reason.
	 *
	 * @param string $payload the payload sent by Stripe\StripeTaxForWooCommerce\SDK\lib
	 * @param string $sigHeader the contents of the signature header sent by
	 *  Stripe\StripeTaxForWooCommerce\SDK\lib
	 * @param string $secret secret used to generate the signature
	 * @param int    $tolerance maximum difference allowed between the header's
	 *     timestamp and the current time
	 *
	 * @throws Exception\UnexpectedValueException if the payload is not valid JSON,
	 * @throws Exception\SignatureVerificationException if the verification fails
	 *
	 * @return Event the Event instance
	 */
	public static function constructEvent( $payload, $sigHeader, $secret, $tolerance = self::DEFAULT_TOLERANCE ) {
		WebhookSignature::verifyHeader( $payload, $sigHeader, $secret, $tolerance );

		$data      = \json_decode( $payload, true );
		$jsonError = \json_last_error();
		if ( null === $data && \JSON_ERROR_NONE !== $jsonError ) {
			$msg = "Invalid payload: {$payload} "
				. "(json_last_error() was {$jsonError})";

			throw new Exception\UnexpectedValueException( $msg );
		}

		return Event::constructFrom( $data );
	}
}