<?php

namespace Stripe\StripeTaxForWooCommerce\SDK\lib\Util;

/**
 * CaseInsensitiveArray is an array-like class that ignores case for keys.
 *
 * It is used to store HTTP headers. Per RFC 2616, section 4.2:
 * Each header field consists of a name followed by a colon (":") and the field value. Field names
 * are case-insensitive.
 *
 * In the context of stripe-php, this is useful because the API will return headers with different
 * case depending on whether HTTP/2 is used or not (with HTTP/2, headers are always in lowercase).
 */
class CaseInsensitiveArray implements \ArrayAccess, \Countable, \IteratorAggregate {

	private $container = array();

	public function __construct( $initial_array = array() ) {
		$this->container = \array_change_key_case( $initial_array, \CASE_LOWER );
	}

	/**
	 * @return int
	 */
	#[\ReturnTypeWillChange]
	public function count() {
		return \count( $this->container );
	}

	/**
	 * @return \ArrayIterator
	 */
	#[\ReturnTypeWillChange]
	public function getIterator() {
		return new \ArrayIterator( $this->container );
	}

	/**
	 * @return void
	 */
	#[\ReturnTypeWillChange]
	public function offsetSet( $offset, $value ) {
		$offset = self::maybeLowercase( $offset );
		if ( null === $offset ) {
			$this->container[] = $value;
		} else {
			$this->container[ $offset ] = $value;
		}
	}

	/**
	 * @return bool
	 */
	#[\ReturnTypeWillChange]
	public function offsetExists( $offset ) {
		$offset = self::maybeLowercase( $offset );

		return isset( $this->container[ $offset ] );
	}

	/**
	 * @return void
	 */
	#[\ReturnTypeWillChange]
	public function offsetUnset( $offset ) {
		$offset = self::maybeLowercase( $offset );
		unset( $this->container[ $offset ] );
	}

	/**
	 * @return mixed
	 */
	#[\ReturnTypeWillChange]
	public function offsetGet( $offset ) {
		$offset = self::maybeLowercase( $offset );

		return isset( $this->container[ $offset ] ) ? $this->container[ $offset ] : null;
	}

	private static function maybeLowercase( $v ) {
		if ( \is_string( $v ) ) {
			return \strtolower( $v );
		}

		return $v;
	}
}