<?php
// phpcs:ignoreFile
/**
 * Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved
 *
 * This source code is licensed under the license found in the
 * LICENSE file in the root directory of this source tree.
 *
 * @package FacebookCommerce
 */

namespace SkyVerge\WooCommerce\Facebook;

defined( 'ABSPATH' ) or exit;

/**
 * Base handler for Commerce-specific functionality.
 *
 * @since 2.1.0
 */
class Commerce {


	/** @var string option that stores the plugin-level fallback Google product category ID */
	const OPTION_GOOGLE_PRODUCT_CATEGORY_ID = 'wc_facebook_google_product_category_id';


	/** @var Commerce\Orders the orders handler */
	protected $orders;


	/**
	 * Commerce handler constructor.
	 *
	 * @since 2.1.0
	 */
	public function __construct() {

		require_once __DIR__ . '/Commerce/Orders.php';

		$this->orders = new Commerce\Orders();
	}


	/**
	 * Gets the plugin-level fallback Google product category ID.
	 *
	 * This will be used when the category or product-level settings don’t override it.
	 *
	 * @since 2.1.0
	 *
	 * @return string
	 */
	public function get_default_google_product_category_id() {

		$category_id = get_option( self::OPTION_GOOGLE_PRODUCT_CATEGORY_ID, '' );

		/**
		 * Filters the plugin-level fallback Google product category ID.
		 *
		 * @since 2.1.0
		 *
		 * @param string $category_id default Google product category ID
		 * @param Commerce $commerce commerce handler instance
		 */
		return (string) apply_filters( 'wc_facebook_commerce_default_google_product_category_id', $category_id, $this );
	}


	/**
	 * Updates the plugin-level fallback Google product category ID.
	 *
	 * @since 2.1.0
	 *
	 * @param string $id category ID
	 */
	public function update_default_google_product_category_id( $id ) {

		update_option( self::OPTION_GOOGLE_PRODUCT_CATEGORY_ID, is_string( $id ) ? $id : '' );
	}


	/**
	 * Determines whether Commerce features should be available.
	 *
	 * @since 2.1.0
	 *
	 * @return bool whether Commerce features should be available
	 */
	public function is_available() {

		list( $country ) = explode( ':', get_option( 'woocommerce_default_country' ) );

		/**
		 * Filters whether Commerce features should be available.
		 *
		 * @since 2.1.0
		 *
		 * @param bool $available whether commerce features should be available
		 * @param string $country country code
		 * @param Commerce $commerce commerce handler instance
		 */
		return (bool) apply_filters( 'wc_facebook_commerce_is_available', 'US' === $country, $country, $this );
	}


	/**
	 * Determines whether the site is connected.
	 *
	 * @since 2.1.0
	 *
	 * @return bool whether the site is connected
	 */
	public function is_connected() {

		$connection_handler = facebook_for_woocommerce()->get_connection_handler();

		$connected = (bool) strlen( $connection_handler->get_page_access_token() ) && ! empty( $connection_handler->get_commerce_manager_id() );

		/**
		 * Filters whether the site is connected.
		 *
		 * @since 2.1.0
		 *
		 * @param bool $connected whether the site is connected
		 * @param Commerce $commerce commerce handler instance
		 */
		return (bool) apply_filters( 'wc_facebook_commerce_is_connected', $connected, $this );
	}


	/**
	 * Gets the orders handler instance.
	 *
	 * @since 2.1.0
	 *
	 * @return \SkyVerge\WooCommerce\Facebook\Commerce\Orders
	 */
	public function get_orders_handler() {

		return $this->orders;
	}


}
