<?php

namespace ipinfo\ipinfo\cache;

/**
 * Default implementation of the CacheInterface. Provides in-memory caching.
 */
class DefaultCache implements CacheInterface
{

    public $maxsize;
    public $ttl;

    private $cache;
    private $element_queue;

    public function __construct(int $maxsize, int $ttl)
    {
        $this->cache = new \Sabre\Cache\Memory();
        $this->element_queue = array();
        $this->maxsize = $maxsize;
        $this->ttl = $ttl;
    }

  /**
   * Tests if the specified IP address is cached.
   * @param  string  $ip_address IP address to lookup.
   * @return boolean Is the IP address data in the cache.
   */
    public function has(string $name)
    {
        return $this->cache->has($name);
    }

  /**
   * Set the IP address key to the specified value.
   * @param string $ip_address IP address to cache data for.
   * @param mixed $value Data for specified IP address.
   */
    public function set(string $name, $value)
    {
        if (!$this->cache->has($name)) {
            $this->element_queue[] = $name;
        }

        $this->cache->set($name, $value, $this->ttl);

        $this->manageSize();
    }

  /**
   * Get data for the specified IP address.
   * @param  string $ip_address IP address to lookup in cache.
   * @return mixed IP address data.
   */
    public function get(string $name)
    {
        return $this->cache->get($name);
    }

  /**
   * If cache maxsize has been reached, remove oldest elements until limit is reached.
   */
    private function manageSize()
    {
        $overflow = count($this->element_queue) - $this->maxsize;
        if ($overflow > 0) {
            foreach (array_slice($this->element_queue, 0, $overflow) as $name) {
                if ($this->cache->has($name)) {
                    $this->cache->delete($name);
                }
            }
            $this->element_queue = array_slice($this->element_queue, $overflow);
        }
    }
}
