<?php

namespace Aws\Credentials;

use Serializable;

/**
 * Basic implementation of the AWS Credentials interface that allows callers to
 * pass in the AWS Access Key and AWS Secret Access Key in the constructor.
 */
class Credentials implements CredentialsInterface, Serializable {
	private $key;
	private $secret;
	private $token;
	private $expires;

	/**
	 * Constructs a new BasicAWSCredentials object, with the specified AWS
	 * access key and AWS secret key
	 *
	 * @param string $key AWS access key ID
	 * @param string $secret AWS secret access key
	 * @param string $token Security token to use
	 * @param int $expires UNIX timestamp for when credentials expire
	 */
	public function __construct( $key, $secret, $token = null, $expires = null ) {
		$this->key     = trim( $key );
		$this->secret  = trim( $secret );
		$this->token   = $token;
		$this->expires = $expires;
	}

	public static function __set_state( array $state ) {
		return new self(
			$state['key'],
			$state['secret'],
			$state['token'],
			$state['expires']
		);
	}

	public function getAccessKeyId() {
		return $this->key;
	}

	public function getSecretKey() {
		return $this->secret;
	}

	public function getSecurityToken() {
		return $this->token;
	}

	public function getExpiration() {
		return $this->expires;
	}

	public function isExpired() {
		return $this->expires !== null && time() >= $this->expires;
	}

	public function serialize() {
		return json_encode( $this->toArray() );
	}

	public function toArray() {
		return [
			'key'     => $this->key,
			'secret'  => $this->secret,
			'token'   => $this->token,
			'expires' => $this->expires
		];
	}

	public function unserialize( $serialized ) {
		$data = json_decode( $serialized, true );

		$this->key     = $data['key'];
		$this->secret  = $data['secret'];
		$this->token   = $data['token'];
		$this->expires = $data['expires'];
	}
}
