<?php
/**
 * Add a comment to show which template is being used on the current page.
 *
 * @package CWC
 * @since 1.0.0
 */

namespace CWC;

/**
 * Class ShowTemplate
 *
 * Displays the active WordPress template in the footer for debugging purposes.
 * Determines which template WordPress has chosen to use and outputs it as an HTML comment.
 *
 * @package CWC
 * @since 1.0.0
 */
class ShowTemplate {
	/**
	 * The template file path that WordPress has chosen to use.
	 *
	 * @var string|false
	 */
	private $template = false;

	/**
	 * Constructor for ShowTemplate class.
	 *
	 * Initializes the template checking functionality by hooking into template_redirect action.
	 * Does nothing if called from admin area.
	 *
	 * @since 1.0.0
	 */
	public function __construct() {
		if ( is_admin() ) {
			return;
		}

        add_action( 'template_redirect', array( &$this, 'checkTemplate' ), 0 );
	}

	/**
	 * Using the same logic used by WordPress determine the template to be used
	 *
	 * @since 1.0.0
	 */
	public function checkTemplate() {
		if ( is_404() ) {
			$template = get_404_template();

            if ( $template ) {
				$this->template = $template;
			}
		} elseif ( is_search() ) {
			$template = get_search_template();

            if ( $template ) {
				$this->template = $template;
			}
		} elseif ( is_tax() ) {
			$template = get_taxonomy_template();

            if ( $template ) {
				$this->template = $template;
			}
		} elseif ( is_home() ) {
			$template = get_home_template();

            if ( $template ) {
				$this->template = $template;
			}
		} elseif ( is_front_page() ) {
			$template = get_front_page_template();

            if ( $template ) {
				$this->template = $template;
			}
		} elseif ( is_attachment() ) {
			$template = get_attachment_template();

            if ( $template ) {
				$this->template = $template;
			}
		} elseif ( is_single() ) {
			$template = get_single_template();

            if ( $template ) {
				$this->template = $template;
			}
		} elseif ( is_page() ) {
			$template = get_page_template();

            if ( $template ) {
				$this->template = $template;
			}
		} elseif ( is_category() ) {
			$template = get_category_template();

            if ( $template ) {
				$this->template = $template;
			}
		} elseif ( is_tag() ) {
			$template = get_tag_template();

            if ( $template ) {
				$this->template = $template;
			}
		} elseif ( is_author() ) {
			$template = get_author_template();

            if ( $template ) {
				$this->template = $template;
			}
		} elseif ( is_date() ) {
			$template = get_date_template();

            if ( $template ) {
				$this->template = $template;
			}
		} elseif ( is_archive() ) {
			$template = get_archive_template();

            if ( $template ) {
				$this->template = $template;
			}
		} else {
			$this->template = function_exists( 'get_index_template' ) ? get_index_template() : get_template_directory() . '/index.php';
		}

        $this->template = apply_filters( 'template_include', $this->template );

        // Hook into the footer so we can echo the active template
		add_action( 'wp_footer', array( &$this, 'show_template' ), 100 );
	}

	/**
	 * Echo the active template to the footer
	 * Try to catch when a plugin or otherwise hooks template_redirect to include a different template
	 *
	 * @since 1.0.0
	 */
	public function show_template() {
		$fudge = false;

		foreach ( debug_backtrace() as $trace ) { // phpcs:ignore
			switch ( $trace['function'] ) {
				case 'wp_footer':
					$wp_footer = $trace['file'];
					break;
				case 'get_footer':
					$get_footer = $trace['file'];
					break;
			}
		}

		$fudge = isset( $get_footer ) ? $get_footer : $wp_footer;

        // phpcs:disable
		if ( $fudge === $this->template || $fudge === false ) {
			echo "<!-- Active Template: {$this->template} -->\n";
		} else {
			echo "<!--\n";
			echo "The template loader logic has chosen a different template than what was used.\n\n";
			echo "Chosen Template: {$this->template}\n";
			echo "Actual Template: $fudge\n\n";
			echo "This will usually occur if the template file was overriden using an action on template_redirect.\n";
			echo "This is a best effort guess to catch such scenarios as mentioned above but can be incorrect.\n";
			echo "-->\n";
		}
        // phpcs:enable
	}
}

$ShowTemplate = new ShowTemplate();
