<?php
/**
 * Default Values
 *
 * @package surerank
 * @since 0.0.1
 */

namespace SureRank\Inc\Functions;

if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly.
}

use SureRank\Inc\API\Onboarding;
use SureRank\Inc\Schema\Utils;
use SureRank\Inc\Traits\Get_Instance;

/**
 * Default Values
 * This class will handle all default values.
 *
 * @since 1.0.0
 */
class Defaults {

	use Get_Instance;

	/**
	 * Default values for the global - General.
	 *
	 * @var array<string, mixed>
	 * @since 1.0.0
	 */
	private $global_general_defaults = [
		'separator'                 => '-',
		'page_title'                => '%title% - %site_name%',
		'auto_generate_description' => true,
		'page_description'          => '%content%',
		'auto_description'          => '',
		'fallback_image'            => '',
		'auto_generated_og_image'   => '',
		'canonical_url'             => '',
		'focus_keyword'             => '',
	];

	/**
	 * Default values for the global - Homepage.
	 *
	 * @var array<string, mixed>
	 * @since 1.0.0
	 */
	private $feature_management_defaults = [
		'enable_page_level_seo' => true,
		'enable_google_console' => true,
		'enable_schemas'        => true,
		'enable_migration'      => true,
	];

	/**
	 * Default values for the global - Homepage.
	 *
	 * @var array<string, mixed>
	 * @since 1.0.0
	 */
	private $global_homepage_defaults = [
		'home_page_title'                 => '%site_name% - %tagline%',
		'home_page_description'           => '%tagline%',
		'home_page_facebook_image_url'    => '',
		'home_page_facebook_title'        => '',
		'home_page_facebook_description'  => '',
		'home_page_twitter_image_url'     => '',
		'home_page_twitter_title'         => '',
		'home_page_twitter_description'   => '',
		'home_page_robots'                => [
			'general' => [],
		],
		'index_home_page_paginated_pages' => true,
	];

	/**
	 * Default values for the global - Social.
	 *
	 * @var array<string, mixed>
	 * @since 1.0.0
	 */
	private $global_social_defaults = [
		'open_graph_tags'             => true,
		'facebook_meta_tags'          => true,
		'twitter_meta_tags'           => true,
		'oembeded_scripts'            => true,
		'oembeded_og_title'           => true,
		'oembeded_social_images'      => true,
		'oembeded_remove_author_name' => true,
		'facebook_page_url'           => '',
		'facebook_author_fallback'    => '',
		'twitter_card_type'           => 'summary_large_image',
		'twitter_same_as_facebook'    => true,
		'twitter_profile_username'    => '',
		'twitter_profile_fallback'    => '',
	];

	/**
	 * Default values for the global - Special Pages.
	 *
	 * @var array<string, mixed>
	 * @since 1.0.0
	 */
	private $global_special_pages_defaults = [
		'author_archive'               => false,
		'date_archive'                 => false,
		'noindex_paginated_pages'      => false,
		'paginated_link_relationships' => [ 'homepage', 'pages', 'archives' ],
	];

	/**
	 * Default values for the global - Advanced - Feeds.
	 *
	 * @var array<string, mixed>
	 * @since 1.0.0
	 */
	private $global_advanced_feeds_default = [
		'addlink_to_source_below_feed_entries' => true,
		'remove_global_comments_feed'          => false,
		'remove_post_authors_feed'             => false,
		'remove_post_types_feed'               => false,
		'remove_category_feed'                 => false,
		'remove_tag_feeds'                     => false,
		'remove_custom_taxonomy_feeds'         => false,
		'remove_search_results_feed'           => false,
		'remove_atom_rdf_feeds'                => false,
	];

	/**
	 * Default values for the global - Advanced - Sitemaps.
	 *
	 * @var array<string, mixed>
	 * @since 1.0.0
	 */
	private $global_advanced_sitemaps_default = [
		'enable_xml_sitemap'       => true,
		'enable_xml_image_sitemap' => true,
	];

	/**
	 * Default values for the global - Advanced - Images.
	 *
	 * @var array<string, mixed>
	 * @since 1.0.0
	 */
	private $global_advanced_images_defaults = [
		'redirect_attachment_pages_to_post_parent' => true,
		'auto_set_image_title'                     => true,
		'auto_set_image_alt'                       => true,
	];

	/**
	 * Default values for the global - Advanced - Miscellaneous.
	 *
	 * @var array<string, mixed>
	 * @since 1.0.0
	 */
	private $global_advanced_miscellaneous_defaults = [
		'surerank_usage_optin' => false,
	];

	/**
	 * Default values for the global - Integrations.
	 *
	 * These flags control whether SureRank loads optional compatibility layers
	 * for supported third-party plugins. They default to enabled so existing
	 * plugin behavior continues to work as soon as the matching plugin is active.
	 *
	 * @var array<string, mixed>
	 * @since 1.7.5
	 */
	private $global_integrations_defaults = [
		'enable_woocommerce_integration' => true,
		'enable_angie_integration'       => true,
	];

	/**
	 * Default values for the global - Advanced - Robots.
	 *
	 * @var array<string, mixed>
	 * @since 1.0.0
	 */
	private $global_advanced_robots_default = [
		'no_index'   => [
			'post_format',
			'attachment',
			'author',
			'date',
			'search',
		],
		'no_follow'  => [],
		'no_archive' => [],
	];

	/**
	 * Default values for the Post/CPT.
	 *
	 * @var array<string, mixed>
	 * @since 1.0.0
	 */
	private $post_defaults = null;

	/**
	 * Cached global defaults.
	 *
	 * @var array<string, mixed>|null
	 * @since 1.7.2
	 */
	private $cached_global_defaults = null;

	/**
	 * Constructor.
	 *
	 * @since 1.0.0
	 */
	public function __construct() {
		$this->post_defaults = [
			'general'         => $this->get_general_defaults(),
			'post_no_index'   => '',
			'post_no_follow'  => '',
			'post_no_archive' => '',
			'social'          => array_merge(
				$this->get_social_defaults(),
				[
					// Facebook.
					'facebook_title'           => '',
					'facebook_description'     => '',
					'facebook_image_url'       => '',
					'facebook_image_id'        => 0,
					'facebook_image_width'     => 0,
					'facebook_image_height'    => 0,
					// (X) Twitter.
					'twitter_title'            => '',
					'twitter_description'      => '',
					'twitter_image_url'        => '',
					'twitter_image_id'         => 0,
					'twitter_card_type'        => 'summary_large_image',
					'twitter_same_as_facebook' => true,
					'twitter_profile_username' => '',
					'twitter_profile_fallback' => '',
				]
			),
			'schemas'         => [
				'schemas' => Utils::get_default_schemas(),
			],
		];
	}

	/**
	 * Default values for the global.
	 *
	 * @param string $key Key.
	 * @return mixed
	 * @since 1.0.0
	 */
	public function get_global_defaults( $key = '' ) {
		if ( null === $this->cached_global_defaults ) {
			$social_profiles_array = [];
			foreach ( Onboarding::social_profiles() as $profile ) {
				$social_profiles_array[ $profile['id'] ] = '';
			}

			$this->cached_global_defaults = apply_filters(
				'surerank_global_defaults',
				array_merge(
					// General Settings.
					$this->get_general_defaults(),
					$this->get_homepage_defaults(),
					$this->get_social_defaults(),
					$this->feature_management_defaults(),
					$this->get_special_pages_defaults(),
					$this->get_feeds_defaults(),
					$this->get_sitemap_defaults(),
					$this->get_robots_defaults(),
					$this->get_images_defaults(),
					$this->get_advanced_miscellaneous_defaults(),
					$this->get_integrations_defaults(),
					[
						'schemas' => Utils::get_default_schemas(),
					],
					[
						'social_profiles' => $social_profiles_array,
					]
				)
			);
		}

		if ( ! empty( $key ) && isset( $this->cached_global_defaults[ $key ] ) ) {
			return $this->cached_global_defaults[ $key ];
		}

		return $this->cached_global_defaults;
	}

	/**
	 * Clear the cached global defaults.
	 *
	 * @since 1.7.2
	 * @return void
	 */
	public function clear_cached_defaults() {
		$this->cached_global_defaults = null;
	}

	/**
	 * Default values for the Post/CPT.
	 *
	 * @param bool $flat Flat.
	 * @return array<string, mixed>
	 * @since 1.0.0
	 */
	public function get_post_defaults( $flat = true ) {
		$all_settings = [];

		if ( ! $flat ) {
			return apply_filters(
				'surerank_post_defaults',
				$this->post_defaults,
			);
		}

		foreach ( $this->post_defaults as $option_value ) {

			if ( ! empty( $option_value ) ) {
				$all_settings = array_merge( $all_settings, $option_value );
			}
		}

		return apply_filters(
			'surerank_post_defaults',
			$all_settings,
		);
	}

	/**
	 * Values for the Post/CPT meta keys.
	 *
	 * @return array<string, mixed>|array<int, array<string, mixed>>
	 * @since 1.0.0
	 */
	public function get_post_meta_keys() {
		if ( empty( $this->post_defaults ) ) {
			return [];
		}
		return array_keys( $this->post_defaults );
	}

	/**
	 * Default values for the onboarding.
	 *
	 * @return array<string, mixed>
	 * @since 1.0.0
	 */
	public function get_onboarding_defaults() {
		return apply_filters(
			'surerank_onboarding_defaults',
			[
				'first_name'          => '',
				'last_name'           => '',
				'email'               => '',
				'subscribe'           => false,
				'agree_to_terms'      => false,
				'website_type'        => [],
				'website_name'        => '',
				'website_owner_name'  => '',
				'website_owner_phone' => '',
				'website_logo'        => [],
				'about_page'          => [],
				'contact_page'        => [],
				'social_profiles'     => [
					'facebook'  => '',
					'twitter'   => '',
					'instagram' => '',
					'youtube'   => '',
					'linkedin'  => '',
					'tiktok'    => '',
					'pinterest' => '',
					'reddit'    => '',
					'snapchat'  => '',
					'twitch'    => '',
					'whatsapp'  => '',
					'telegram'  => '',
					'vimeo'     => '',
					'yelp'      => '',
				],
			],
		);
	}

	/**
	 * Get general defaults with filter.
	 *
	 * @return array<string, mixed>
	 * @since 1.2.0
	 */
	private function get_general_defaults() {
		return apply_filters( 'surerank_general_defaults', $this->global_general_defaults );
	}

	/**
	 * Get homepage defaults with filter.
	 *
	 * @return array<string, mixed>
	 * @since 1.2.0
	 */
	private function get_homepage_defaults() {
		return apply_filters( 'surerank_homepage_defaults', $this->global_homepage_defaults );
	}

	/**
	 * Get social defaults with filter.
	 *
	 * @return array<string, mixed>
	 * @since 1.2.0
	 */
	private function get_social_defaults() {
		return apply_filters( 'surerank_social_defaults', $this->global_social_defaults );
	}

	/**
	 * Get feature management defaults with filter.
	 *
	 * @return array<string, mixed>
	 * @since 1.2.0
	 */
	private function feature_management_defaults() {
		return apply_filters( 'surerank_feature_management_defaults', $this->feature_management_defaults );
	}

	/**
	 * Get special pages defaults with filter.
	 *
	 * @return array<string, mixed>
	 * @since 1.2.0
	 */
	private function get_special_pages_defaults() {
		return apply_filters( 'surerank_special_pages_defaults', $this->global_special_pages_defaults );
	}

	/**
	 * Get feeds defaults with filter.
	 *
	 * @return array<string, mixed>
	 * @since 1.2.0
	 */
	private function get_feeds_defaults() {
		return apply_filters( 'surerank_feeds_defaults', $this->global_advanced_feeds_default );
	}

	/**
	 * Get sitemap defaults with filter.
	 *
	 * @return array<string, mixed>
	 * @since 1.2.0
	 */
	private function get_sitemap_defaults() {
		return apply_filters( 'surerank_sitemap_defaults', $this->global_advanced_sitemaps_default );
	}

	/**
	 * Get robots defaults with filter.
	 *
	 * @return array<string, mixed>
	 * @since 1.2.0
	 */
	private function get_robots_defaults() {
		return apply_filters( 'surerank_robots_defaults', $this->global_advanced_robots_default );
	}

	/**
	 * Get images defaults with filter.
	 *
	 * @return array<string, mixed>
	 * @since 1.2.0
	 */
	private function get_images_defaults() {
		return apply_filters( 'surerank_images_defaults', $this->global_advanced_images_defaults );
	}

	/**
	 * Get advanced miscellaneous defaults with filter.
	 *
	 * @return array<string, mixed>
	 * @since 1.2.0
	 */
	private function get_advanced_miscellaneous_defaults() {
		return apply_filters( 'surerank_advanced_miscellaneous_defaults', $this->global_advanced_miscellaneous_defaults );
	}

	/**
	 * Get integrations defaults with filter.
	 *
	 * The `surerank_integrations_defaults` filter can be used to override the
	 * default enabled state for supported third-party integrations. Returned
	 * values are normalized to booleans before they are merged into settings.
	 *
	 * @return array<string, mixed>
	 * @since 1.7.5
	 */
	private function get_integrations_defaults() {
		$defaults = apply_filters( 'surerank_integrations_defaults', $this->global_integrations_defaults );

		if ( ! is_array( $defaults ) ) {
			$defaults = $this->global_integrations_defaults;
		}

		return [
			'enable_woocommerce_integration' => $this->sanitize_boolean_default( $defaults['enable_woocommerce_integration'] ?? $this->global_integrations_defaults['enable_woocommerce_integration'] ),
			'enable_angie_integration'       => $this->sanitize_boolean_default( $defaults['enable_angie_integration'] ?? $this->global_integrations_defaults['enable_angie_integration'] ),
		];
	}

	/**
	 * Sanitize a boolean default value.
	 *
	 * @param mixed $value Value to sanitize.
	 * @return bool
	 * @since 1.7.5
	 */
	private function sanitize_boolean_default( $value ) {
		return true === $value || 1 === $value || '1' === $value || 'true' === $value;
	}
}
