<?php

/**
 * Types_Helper_Placeholder
 *
 * @since 2.0
 */
class Types_Helper_Placeholder {

	private static $cache = array();

	private static $post_type;

	public static function set_post_type( $posttype = false ) {

		if( ! $posttype ) {
			global $typenow;

			$posttype = isset( $typenow ) && ! empty( $typenow ) ? $typenow : false;
		}

		if( $posttype )
			self::$post_type = get_post_type_object( $posttype );
	}

	public static function replace( &$original ) {
		if( self::$post_type == null )
			self::set_post_type();

		if( is_array( $original ) ) {
			foreach( $original as &$nested ) {
				self::replace( $nested );
			}
			return;
		}

		// skip if there are no placeholders
		if( strpos( $original, '%' ) === false )
			return;


		// placeholders
		$admin_url = admin_url();
		$placeholders = array(
			'%POST-LABEL-PLURAL%'               => self::$post_type->labels->name,
			'%POST-PERMALINK%'                  => self::get_permalink(),
			'%POST-ARCHIVE-PERMALINK%'          => self::get_archive_permalink(),
			'%POST-LABEL-SINGULAR%'             => self::$post_type->labels->singular_name,
			'%POST-TYPE-NAME%'                  => self::$post_type->name,
			'%THEME-NAME%'                      => wp_get_theme(),
			'%POST-TEMPLATE-FILE%'              => '<nobr>' . self::get_post_template_file() . '</nobr>',
			'%POST-ARCHIVE-FILE%'               => '<nobr>' . self::get_post_archive_file() . '</nobr>',
			'%POST-FORMS-LIST%'                 => self::get_post_type_forms_list(),
			'%POST-CREATE-FORM%'                => self::add_referer( $admin_url . 'admin.php?page=types-helper&action=new-form&type=' . self::$post_type->name.'&toolset_help_video=cred_form' ),
			'%POST-TYPE-EDIT-HAS-ARCHIVE%'      => self::add_referer( $admin_url . 'admin.php?page=wpcf-edit-type&wpcf-post-type=' . self::$post_type->name . '#types_options' ),
			'%POST-CUSTOM-ERRORS-ELEMENTS-LIST%'  => self::get_access_custom_errors_elements( 'single_page_list' ),
			'%POST-ARCHIVE-TERM-LIST%' => Types_Helper_Condition_Views_Archive_Exists::get_terms_archives_list(),
			'%POST-ARCHIVE-CUSTOM-ERRORS-ELEMENTS-LIST%' => self::get_access_custom_errors_elements( 'archive_page_list' ),
		);

		// Views specifics
		if( defined( 'WPV_VERSION' ) ) {
			$placeholders = array_merge( $placeholders, array(
				//'%POST-CREATE-LAYOUT-TEMPLATE%'           => self::get_post_create_layout_template(),
				'%POST-CONTENT-TEMPLATE-NAME%'              => Types_Helper_Condition_Views_Template_Exists::get_template_name(),
				'%POST-CONTENT-TEMPLATE-CONDITIONS-LIST%'	=> Types_Helper_Condition_Views_Template_Exists::get_conditional_templates_list(),
				'%POST-VIEWS-ARCHIVE%'                      => Types_Helper_Condition_Views_Archive_Exists::get_template_name(),
				'%POST-EDIT-VIEWS-ARCHIVE%'                 => self::get_post_edit_views_archive(),
				'%POST-EDIT-CONTENT-TEMPLATE%'              => self::get_post_edit_views_template(),
				'%POST-CREATE-CONTENT-TEMPLATE%'            => self::add_referer( $admin_url . 'admin.php?page=types-helper&action=new-content-template&type='.self::$post_type->name.'&toolset_help_video=views_template' ),
				'%POST-CREATE-VIEWS-ARCHIVE%'               => self::add_referer( $admin_url . 'admin.php?page=types-helper&action=new-wordpress-archive&type='.self::$post_type->name.'&toolset_help_video=views_archives' ),
				'%POST-CREATE-VIEWS-ARCHIVE-TYPE%'          => self::$post_type->name,
				'%POST-CREATE-VIEWS-ARCHIVE-REDIRECT-URL%'  => '&' . self::add_referer( 'toolset_help_video=views_archives' ),
				'%POST-CREATE-VIEWS-ARCHIVE-FOR-WHOM-TITLE%' => self::$post_type->label,
				'%POST-CREATE-VIEWS-ARCHIVE-FOR-WHOM-LOOP%' => esc_attr(
					'post' === self::$post_type->name ?
						'wpv-view-loop-home-blog-page' :
						'wpv-view-loop-cpt_' . self::$post_type->name
				),
				//'%POST-CREATE-VIEWS-ARCHIVE%'             => self::get_post_create_views_archive(),
				'%POST-VIEWS-LIST%'                         => self::get_post_type_views_list(),
				'%POST-CREATE-VIEW%'                        => self::add_referer( $admin_url . 'admin.php?page=types-helper&action=new-view&type=' . self::$post_type->name . '&toolset_help_video=views_view' ),
				'%POST-CREATE-VIEW-TYPE%'                   => self::$post_type->name,
				'%POST-CREATE-VIEW-REDIRECT-URL%'           => '&' . self::add_referer( 'toolset_help_video=views_view' ),
			) );

		}

		// Layouts specifics
		if( defined( 'WPDDL_DEVELOPMENT' ) || defined( 'WPDDL_PRODUCTION' ) )  {
			$placeholders = array_merge( $placeholders, array(
				//'%POST-CREATE-LAYOUT-TEMPLATE%'     => self::get_post_create_layout_template(),
				'%POST-CREATE-LAYOUT-TEMPLATE%'     => self::add_referer( $admin_url . 'admin.php?page=types-helper&action=new-layout-template&type='.self::$post_type->name.'&toolset_help_video=layouts_template' ),
				'%POST-CREATE-LAYOUT-ARCHIVE%'      => self::add_referer( self::get_post_create_layout_archive() . '&toolset_help_video=layouts_archive' ),
				'%POST-EDIT-LAYOUT-TEMPLATE%'       => self::get_post_edit_layout_template(),
				'%POST-EDIT-LAYOUT-ARCHIVE%'        => self::get_post_edit_layout_archive(),
				'%POST-LAYOUT-TEMPLATE%'            => Types_Helper_Condition_Layouts_Template_Exists::get_layout_name(),
				'%POST-LAYOUT-ARCHIVE%'             => Types_Helper_Condition_Layouts_Archive_Exists::get_layout_name(),
			) );
		}

		$original = strtr( $original, $placeholders );
	}

	private static function get_post_create_views_archive() {
		$tool_admin_bar = Toolset_Admin_Bar_Menu::get_instance();

		$post_type = self::$post_type->name == 'post' ? 'home-blog' : self::$post_type->name;
		return $tool_admin_bar->get_edit_link( 'views', true, $post_type, 'archive', 0 );
	}

	private static function get_post_edit_views_template() {
		$url = admin_url() . 'admin.php?page=ct-editor&ct_id='
		       . Types_Helper_Condition_Views_Template_Exists::get_template_id();

		return self::add_referer( $url );
	}

	private static function get_post_edit_views_archive() {
		$url = admin_url() . 'admin.php?page=view-archives-editor&view_id='
		       . Types_Helper_Condition_Views_Archive_Exists::get_template_id();

		/**
		 * Filters the edit link for WordPress Archives located in the Toolset Dashboard, to also handle WordPress Archives
		 * created by the WordPress Archive block.
		 *
		 * @param  string     $wpa_edit_link
		 * @param  int|null   $wpa_id
		 *
		 * @return string
		 */
		$url = apply_filters(
			'wpv_filter_wpa_edit_link',
			$url,
			Types_Helper_Condition_Views_Archive_Exists::get_template_id()
		);

		return self::add_referer( $url );
	}

	private static function get_post_create_layout_archive() {
		$tool_admin_bar = Toolset_Admin_Bar_Menu::get_instance();

		// change name to 'home-blog' for build-in "Posts"
		$post_type = self::$post_type->name == 'post'
			? 'home-blog'
			: self::$post_type->name;

		return $tool_admin_bar->get_edit_link( 'layouts', true, $post_type, 'archive', 0 );
	}

	private static function get_post_edit_layout_archive() {
		$url = admin_url() . 'admin.php?page=dd_layouts_edit&action=edit&layout_id='
				. Types_Helper_Condition_Layouts_Archive_Exists::get_layout_id();

		return self::add_referer( $url );
	}

	private static function get_post_edit_layout_template() {
		$url = admin_url() . 'admin.php?page=dd_layouts_edit&action=edit&layout_id='
		       . Types_Helper_Condition_Layouts_Template_Exists::get_layout_id();
		return self::add_referer( $url );
	}

	private static function add_referer( $url ) {
		if( isset( $_GET['page'] ) && $_GET['page'] == 'toolset-dashboard' )
			$url = add_query_arg( 'ref', 'dashboard', $url );

		return $url;
	}

	private static function get_post_template_file() {
		$helper = new Types_Helper_Condition_Single_Exists();
		return basename( $helper->find_template() );
	}

	private static function get_post_archive_file() {
		$helper = new Types_Helper_Condition_Archive_Exists();
		return basename( $helper->find_template() );
	}

	public static function get_permalink( $id = 0 ) {
		$permalink = get_permalink( $id );

		if( $permalink ) {
			$query_args['preview'] = 'true';
			$permalink = add_query_arg( $query_args, $permalink );
			return $permalink;
		}

		if( isset( $_GET['post'] ) && $id != $_GET['post'] ) {
			$get_permalink_id = (int) $_GET['post'];
			return self::get_permalink( $get_permalink_id );
		}

		// cpt edit page
		if( isset( $_GET['wpcf-post-type'] ) && $id == 0 ) {
			$get_permalink_post_type = sanitize_text_field( $_GET['wpcf-post-type'] );
			$query = new WP_Query( 'post_type=' . $get_permalink_post_type . '&posts_per_page=1' );
			if( $query->have_posts() )
				return self::get_permalink( $query->posts[0]->ID );
		}

		// fields edit page
		if( is_object( self::$post_type ) && $id == 0 ){
			$query = new WP_Query( 'post_type=' . self::$post_type->name . '&posts_per_page=1' );
			if( $query->have_posts() )
				return self::get_permalink( $query->posts[0]->ID );
		}

		return false;
	}

	public static function get_archive_permalink() {
		if( array_key_exists( 'wpcf-post-type', $_GET ) ) {
			$post_type = sanitize_text_field( $_GET['wpcf-post-type'] );
		} else {
			if( ! is_object( self::$post_type ) )
				self::set_post_type();

			$post_type = self::$post_type->name;
		}

		// check cache
		if( array_key_exists( $post_type, self::$cache ) && array_key_exists( 'archive_permalink', self::$cache[$post_type] ) )
			return self::$cache[$post_type]['archive_permalink'];

		// get new
		$query = new WP_Query( 'post_type=' . $post_type . '&post_status=publish&posts_per_page=1' );

		self::$cache[$post_type]['archive_permalink'] = $query->have_posts()
			? get_post_type_archive_link( $post_type )
			: false;

		return self::$cache[$post_type]['archive_permalink'];
	}

	private static function get_post_type_views_list() {
		// @todo use twig
		if( $views = Types_Helper_Condition_Views_Views_Exist::get_views_of_post_type() ) {
			$output = '<ul>';
			foreach( $views as $view ) {
				$maybe_gutenberg_view = get_post_meta( $view['id'], '_wpv_is_gutenberg_view', true );
				$is_gutenberg_view = ! $maybe_gutenberg_view ? false : true;
				if ( ! $is_gutenberg_view ) {
					$view_edit_link = admin_url() . 'admin.php?page=views-editor&view_id=' . $view['id'];
					$output .= '<li><a href="'. self::add_referer( $view_edit_link )  . '">'. $view['name'].'</a></li>';
				}
			}
			$output .= '</ul>';

			return $output;
		}

		return __( 'No Views', 'wpcf' );
	}

	private static function get_post_type_forms_list() {
		// @todo use twig
		if( $forms = Types_Helper_Condition_Cred_Forms_Exist::get_forms_of_post_type() ) {
			$output = '<ul>';
			foreach( $forms as $form ) {
				$form_edit_link = get_edit_post_link( $form['id'] );
				$output .= '<li><a href="'. self::add_referer( $form_edit_link ) . '">'. $form['name'].'</a></li>';
			}
			$output .= '</ul>';

			return $output;
		}

		return __( 'No Forms', 'wpcf' );
	}


	/**
	 * @param string $list_type
	 *
	 * @return string
	 */
	private static function get_access_custom_errors_elements( $list_type = 'single_page_list' ) {
		if ( ! is_object( self::$post_type ) ) {
			self::set_post_type();
		}

		$access_custom_errors_elements = apply_filters( 'toolset_access_get_custom_errors_assigned_elements', '', self::$post_type, $list_type );
		if ( ! is_string( $access_custom_errors_elements ) ) {
			return '';
		}
		return wp_kses_post( $access_custom_errors_elements );
	}

}
