<?php
/**
 * Copyright 2017 Facebook, Inc.
 *
 * You are hereby granted a non-exclusive, worldwide, royalty-free license to
 * use, copy, modify, and distribute this software in source code or binary
 * form for use in connection with the web services and APIs provided by
 * Facebook.
 *
 * As with any software that integrates with the Facebook platform, your use
 * of this software is subject to the Facebook Developer Principles and
 * Policies [http://developers.facebook.com/policy/]. This copyright notice
 * shall be included in all copies or substantial portions of the software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 */
namespace Facebook;

use Facebook\Authentication\AccessToken;
use Facebook\Exceptions\FacebookSDKException;

class FacebookApp {

	/**
	 * @var string The app ID.
	 */
	protected $id;

	/**
	 * @var string The app secret.
	 */
	protected $secret;

	/**
	 * @param string $id
	 * @param string $secret
	 *
	 * @throws FacebookSDKException
	 */
	public function __construct( $id, $secret ) {
		if ( ! is_string( $id )
			// Keeping this for BC. Integers greater than PHP_INT_MAX will make is_int() return false
			&& ! is_int( $id ) ) {
			throw new FacebookSDKException( 'The "app_id" must be formatted as a string since many app ID\'s are greater than PHP_INT_MAX on some systems.' );
		}
		// We cast as a string in case a valid int was set on a 64-bit system and this is unserialised on a 32-bit system
		$this->id     = (string) $id;
		$this->secret = $secret;
	}

	/**
	 * Returns the app ID.
	 *
	 * @return string
	 */
	public function getId() {
		return $this->id;
	}

	/**
	 * Returns the app secret.
	 *
	 * @return string
	 */
	public function getSecret() {
		return $this->secret;
	}

	/**
	 * Returns an app access token.
	 *
	 * @return AccessToken
	 */
	public function getAccessToken() {
		return new AccessToken( $this->id . '|' . $this->secret );
	}

	/**
	 * Serializes the FacebookApp entity as a string.
	 *
	 * @return string
	 */
	public function serialize() {
		return implode( '|', array( $this->id, $this->secret ) );
	}

	/**
	 * Unserializes a string as a FacebookApp entity.
	 *
	 * @param string $serialized
	 */
	public function unserialize( $serialized ) {
		list($id, $secret) = explode( '|', $serialized );

		$this->__construct( $id, $secret );
	}
}
