<?php
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );

class SQ_Controllers_Audits extends SQ_Classes_FrontController {

	/** @var object Checkin process */
	public $checkin;

	public $blogs;
	public $audit;
	public $audits;

	/** @var SQ_Models_Domain_AuditPage List (used in the view) */
	public $auditpage;

	/** @var SQ_Models_Domain_AuditPage[] List (used in the view) */
	public $auditpages;

	/** @var false|object AI Visibility data from Google Analytics (used in the view) */
	public $aivisibility = false;

	/** @var bool Whether Google Analytics is connected (AI Visibility needs it) */
	public $ga_connected = false;

	/** @var false|SQ_Models_Domain_Post[] All pages that are sent to the view */
	public $pages = false;

	/**
	 *
	 *
	 * @var int Audit history limit
	 */
	public $limit = 10;

	function init() {

		if ( SQ_Classes_Helpers_Tools::getOption( 'sq_api' ) == '' ) {
			$this->show_view( 'Errors/Connect' );

			return;
		}

		//Checkin to API V2
		$this->checkin = SQ_Classes_RemoteController::checkin();

		if ( is_wp_error( $this->checkin ) ) {
			if ( $this->checkin->get_error_message() == 'no_data' ) {
				$this->show_view( 'Errors/Error' );

				return;
			} elseif ( $this->checkin->get_error_message() == 'maintenance' ) {
				$this->show_view( 'Errors/Maintenance' );

				return;
			} elseif ( $this->checkin->get_error_message() == 'reconnect' ) {
				$this->show_view( 'Errors/Reconnect' );

				return;
			}
		}

		$tab = preg_replace( "/[^a-zA-Z0-9]/", "", SQ_Classes_Helpers_Tools::getValue( 'tab', 'audits' ) );

		//AI Visibility has its own menu slug; when reached as a page (not as the ?tab= link) resolve it to its tab
		if ( in_array( SQ_Classes_Helpers_Tools::getValue( 'page' ), array( 'sq_aivisibility', 'aivisibility' ), true ) ) {
			$tab = 'aivisibility';
		}

		if ( method_exists( $this, $tab ) ) {
			if ( SQ_Classes_Helpers_Tools::userCan( 'sq_manage_focuspages' ) ) {
				call_user_func( array( $this, $tab ) );
			}
		}

		SQ_Classes_ObjController::getClass( 'SQ_Classes_DisplayController' )->loadMedia( 'audits' );

		$this->show_view( 'Audits/' . esc_attr( ucfirst( $tab ) ) );

		//get the modal window for the assistant popup
		echo SQ_Classes_ObjController::getClass( 'SQ_Models_Assistant' )->getModal();
	}

	/**
	 * Load for Add Audit Page menu tab
	 */
	public function addpage() {
		// Get the default pages
		if( $this->pages === false ){
			$this->pages = SQ_Classes_ObjController::getClass( 'SQ_Models_Snippet' )->getPages( '' );
		}

		// Get the audit  pages
		$this->auditpage = SQ_Classes_RemoteController::getAuditPages();

		if ( is_wp_error( $this->auditpage ) ) {
			$this->auditpage = false;
		}

	}

	public function compare() {

		SQ_Classes_ObjController::getClass( 'SQ_Classes_DisplayController' )->loadMedia( 'audits' );
		SQ_Classes_ObjController::getClass( 'SQ_Classes_DisplayController' )->loadMedia( 'knob' );
		SQ_Classes_ObjController::getClass( 'SQ_Classes_DisplayController' )->loadMedia( 'scrolltotop' );

	}

	public function audit() {
		$days_back = (int) SQ_Classes_Helpers_Tools::getValue( 'days_back', 30 );
		$sid       = (int) SQ_Classes_Helpers_Tools::getValue( 'sid' );

		if ( $sid ) {

			$this->audit = SQ_Classes_RemoteController::getAudit( array( 'id' => $sid, 'days_back' => $days_back ) );

			if ( $auditpages = SQ_Classes_RemoteController::getAuditPages() ) {

				if ( is_wp_error( $auditpages ) ) {
					SQ_Classes_Error::setError( 'Could not load the Audit Pages.' );
				} else {

					if ( ! empty( $auditpages ) ) {
						foreach ( $auditpages as $auditpage ) {

							/** @var SQ_Models_Domain_FocusPage $auditpage */
							$auditpage = SQ_Classes_ObjController::getDomain( 'SQ_Models_Domain_AuditPage', $auditpage );

							//If there is a local page, then show focus
							if ( $auditpage->getWppost() ) {
								$this->auditpages[] = SQ_Classes_ObjController::getClass( 'SQ_Models_Audits' )->parseAuditPage( $auditpage )->getAuditPage();
							}

						}
					}

					if ( ! is_wp_error( $this->audit ) ) {
						$this->audit = $this->model->prepareAudit( $this->audit );
					}
				}

			}

		} else {
			SQ_Classes_Error::setError( esc_html__( "The audit was not found. Please load another audit.", 'squirrly-seo' ) );

		}

		SQ_Classes_ObjController::getClass( 'SQ_Classes_DisplayController' )->loadMedia( 'audits' );
		SQ_Classes_ObjController::getClass( 'SQ_Classes_DisplayController' )->loadMedia( 'knob' );
		SQ_Classes_ObjController::getClass( 'SQ_Classes_DisplayController' )->loadMedia( 'scrolltotop' );
		SQ_Classes_Error::clearErrors();

	}

	public function audits() {
		SQ_Classes_ObjController::getClass( 'SQ_Classes_DisplayController' )->loadMedia( 'audits' );
		SQ_Classes_ObjController::getClass( 'SQ_Classes_DisplayController' )->loadMedia( 'knob' );

		$this->setAuditPages();
		$this->setAiVisibility();
	}

	/**
	 * AI Visibility tab - how much AI engines (ChatGPT, Perplexity, Gemini, ...) send and cite you.
	 */
	public function aivisibility() {
		SQ_Classes_ObjController::getClass( 'SQ_Classes_DisplayController' )->loadMedia( 'audits' );

		$this->setAiVisibility();
	}

	/**
	 * Load the AI Visibility data (AI-engine traffic from Google Analytics).
	 * Only requested when GA is connected, so we don't hit the cloud for nothing.
	 *
	 * @return void
	 */
	public function setAiVisibility() {
		$connect = SQ_Classes_Helpers_Tools::getOption( 'connect' );

		$ga_connected = ( ! empty( $this->checkin->connection_ga ) || ( is_array( $connect ) && ! empty( $connect['google_analytics'] ) ) );

		$this->ga_connected = (bool) $ga_connected;

		if ( ! $ga_connected ) {
			return;
		}

		$days_back   = (int) SQ_Classes_Helpers_Tools::getValue( 'days_back', 30 );
		$aivisibility = SQ_Classes_RemoteController::getAiVisibility( array( 'days_back' => $days_back ) );

		if ( ! is_wp_error( $aivisibility ) && ! empty( $aivisibility ) ) {
			$this->aivisibility = $aivisibility;
		}
	}

	/**
	 * Set the audit pages and populate them
	 *
	 * @return mixed
	 */
	public function setAuditPages() {
		if ( is_array( $this->auditpages ) && ! empty( $this->auditpages ) ) {
			return $this->auditpages;
		}

		$days_back   = (int) SQ_Classes_Helpers_Tools::getValue( 'days_back', 30 );
		$this->audit = SQ_Classes_RemoteController::getAudit( array( 'days_back' => $days_back ) );

		if ( is_wp_error( $this->audit ) ) {
			SQ_Classes_Error::setError( esc_html__( "Could not load the Audit Page.", 'squirrly-seo' ) );
		} elseif ( $auditpages = SQ_Classes_RemoteController::getAuditPages() ) {

			if ( is_wp_error( $auditpages ) ) {
				SQ_Classes_Error::setError( 'Could not load the Audit Pages.' );
			} else {

				if ( ! empty( $auditpages ) ) {
					foreach ( $auditpages as $auditpage ) {

						/** @var SQ_Models_Domain_FocusPage $auditpage */
						$auditpage = SQ_Classes_ObjController::getDomain( 'SQ_Models_Domain_AuditPage', $auditpage );

						//If there is a local page, then show focus
						$this->auditpages[] = SQ_Classes_ObjController::getClass( 'SQ_Models_Audits' )->parseAuditPage( $auditpage )->getAuditPage();
					}
				}
			}
		}

		return $this->auditpages;
	}

	/**
	 * Load the Google Chart
	 *
	 * @return void
	 */
	public function loadScripts() {
		echo '<script>
               function drawScoreChart(id, values, reverse) {
                    var data = google.visualization.arrayToDataTable(values);

                    var options = {

                      title : "",
                      chartArea:{width:"80%",height:"70%"},
                      bar: {groupWidth: 26},
                      vAxis: {title: "",
                            viewWindowMode:"explicit",
                            viewWindow: {
                              max:100,
                              min:0
                            }},
                      hAxis: {title: ""},
                      seriesType: "bars",
                      series: {2: {type: "line"}},
                      legend: {position: "bottom"},
                      colors:["#6200EE","#589ee4"]
                    };

                    var chart = new google.visualization.ComboChart(document.getElementById(id));
                    chart.draw(data, options);
                    return chart;
                }
          </script>';
	}

	/**
	 * Called when action is triggered
	 *
	 * @return void
	 */
	public function action() {
		parent::action();

		if ( ! SQ_Classes_Helpers_Tools::userCan( 'sq_manage_focuspages' ) ) {
			if ( SQ_Classes_Helpers_Tools::isAjax() ) {
				wp_send_json_error( esc_html__( "You do not have permission to perform this action", 'squirrly-seo' ) );
			} else {
				SQ_Classes_Error::setError( esc_html__( "You do not have permission to perform this action", 'squirrly-seo' ) );
			}
		}

		switch ( SQ_Classes_Helpers_Tools::getValue( 'action' ) ) {
			case 'sq_audits_settings':

				if ( ! SQ_Classes_Helpers_Tools::userCan( 'sq_manage_settings' ) ) {
					return;
				}

				$email = sanitize_email( SQ_Classes_Helpers_Tools::getValue( 'sq_audit_email' ) );
				SQ_Classes_Helpers_Tools::saveOptions( 'sq_audit_email', $email );

				if ( $email <> '' ) {

					//Save the settings on API too
					$args                = array();
					$args['audit_email'] = $email;
					SQ_Classes_RemoteController::saveSettings( $args );
					///////////////////////////////

					//show the saved message
					SQ_Classes_Error::setMessage( esc_html__( "Saved", 'squirrly-seo' ) );
				} else {
					SQ_Classes_Error::setError( esc_html__( "Not a valid email address.", 'squirrly-seo' ) );

				}

				break;
			case 'sq_auditpages_getaudit':

				$json = array();

				//Set all audit pages
				$this->setAuditPages();

				$json['stats'] = $this->get_view( 'Audits/AuditStats' );
				$json['html']  = $this->get_view( 'Audits/AuditPages' );

				//Support for international languages
				if ( function_exists( 'iconv' ) && SQ_Classes_Helpers_Tools::getOption( 'sq_non_utf8_support' ) ) {
					if ( strpos( get_bloginfo( "language" ), 'en' ) === false ) {
						$json['html'] = iconv( 'UTF-8', 'UTF-8//IGNORE', $json['html'] );
					}
				}

				if ( SQ_Classes_Helpers_Tools::isAjax() ) {
					SQ_Classes_Helpers_Tools::setHeader( 'json' );

					if ( SQ_Classes_Error::isError() ) {
						$json['error'] = SQ_Classes_Error::getError();
					}

					if ( SQ_Classes_Helpers_Tools::getValue( 'sq_debug' ) == 'on' ) {
						return;
					}
					echo wp_json_encode( $json );
					exit();
				}
				break;
			case 'sq_audits_search':

				$search      = (string) SQ_Classes_Helpers_Tools::getValue( 'skeyword', '' );
				$this->pages = SQ_Classes_ObjController::getClass( 'SQ_Models_Snippet' )->getPages( $search );

				break;
			case 'sq_audits_compare':
				$sids         = SQ_Classes_Helpers_Tools::getValue( 'sid' );
				$this->audits = array();

				//get all the ids
				if ( $sids && ! empty( $sids ) ) {
					foreach ( $sids as $sid ) {
						$audit = SQ_Classes_RemoteController::getAudit( array( 'id' => $sid ) );

						//Don't add error audits
						if ( ! is_wp_error( $audit ) ) {
							$this->audits[] = $this->model->prepareAudit( $audit );
						}
					}

				}

				break;
			case 'sq_audits_addnew':

				$post_id   = (int) SQ_Classes_Helpers_Tools::getValue( 'post_id', 0 );
				$term_id   = (int) SQ_Classes_Helpers_Tools::getValue( 'term_id', 0 );
				$taxonomy  = SQ_Classes_Helpers_Tools::getValue( 'taxonomy', '' );
				$post_type = SQ_Classes_Helpers_Tools::getValue( 'type', '' );

				if ( $post = SQ_Classes_ObjController::getClass( 'SQ_Models_Snippet' )->getCurrentSnippet( $post_id, $term_id, $taxonomy, $post_type ) ) {

					//Save the post data in DB with the hash
					SQ_Classes_ObjController::getClass( 'SQ_Models_Snippet' )->savePost( $post );

					$args              = array();
					$args['post_id']   = $post->ID;
					$args['hash']      = $post->hash;
					$args['permalink'] = $post->url;
					if ( $auditpage = SQ_Classes_RemoteController::addAuditPage( $args ) ) {
						if ( ! is_wp_error( $auditpage ) ) {
							SQ_Classes_Error::setMessage( esc_html__( "Audit page is added. The audit may take a while so please be patient.", 'squirrly-seo' ) . " <br /> " );
							set_transient( 'sq_auditpage_all', time() );
						} elseif ( $auditpage->get_error_message() == 'limit_exceed' ) {
							SQ_Classes_Error::setError( esc_html__( "You reached the maximum number of audit pages for your account.", 'squirrly-seo' ) . " <br /> " );
						}
					} else {
						SQ_Classes_Error::setError( esc_html__( "Error! Could not add the audit page.", 'squirrly-seo' ) . " <br /> " );
					}

				} else {
					SQ_Classes_Error::setError( esc_html__( "Error! Could not find the audit page in your website.", 'squirrly-seo' ) . " <br /> " );
				}
				break;
			case 'sq_audits_page_update':

				$post_id = (int) SQ_Classes_Helpers_Tools::getValue( 'post_id', 0 );

				if ( $post_id ) {
					$args            = array();
					$args['post_id'] = $post_id;

					if ( $auditpage = SQ_Classes_RemoteController::updateAudit( $args ) ) {
						if ( ! is_wp_error( $auditpage ) ) {
							SQ_Classes_Error::setMessage( esc_html__( "Audit page sent for recheck. It may take a while so please be patient.", 'squirrly-seo' ) . " <br /> " );
						} elseif ( $auditpage->get_error_message() == 'too_many_attempts' ) {
							SQ_Classes_Error::setError( esc_html__( "You've made too many requests, you can request one page audit per hour.", 'squirrly-seo' ) . " <br /> " );
						} else {
							SQ_Classes_Error::setError( esc_html__( "The page could not be sent for reaudit.", 'squirrly-seo' ) . " <br /> " );
						}
					} else {
						SQ_Classes_Error::setError( esc_html__( "The page could not be sent for reaudit.", 'squirrly-seo' ) . " <br /> " );
					}
				}
				break;
			case 'sq_audits_update':

				$auditpage = SQ_Classes_RemoteController::updateAudit();

				if ( ! is_wp_error( $auditpage ) ) {
					SQ_Classes_Error::setMessage( esc_html__( "Audit page sent for recheck. It may take a while so please be patient.", 'squirrly-seo' ) . " <br /> " );
					set_transient( 'sq_auditpage_all', time() );
				} elseif ( $auditpage->get_error_message() == 'too_many_attempts' ) {
					SQ_Classes_Error::setError( esc_html__( "The audit for all pages can be made once an hour.", 'squirrly-seo' ) . " <br /> " );
				}
				break;
			case 'sq_audits_delete':

				if ( $post_id = SQ_Classes_Helpers_Tools::getValue( 'id', false ) ) {
					SQ_Classes_RemoteController::deleteAuditPage( array( 'user_post_id' => $post_id ) );
					SQ_Classes_Error::setError( esc_html__( "The page is removed from GEO Audit.", 'squirrly-seo' ) . " <br /> ", 'success' );
				} else {
					SQ_Classes_Error::setError( esc_html__( "Invalid params!", 'squirrly-seo' ) . " <br /> " );
				}

				break;
			case 'sq_ajax_audit_bulk_delete':

				SQ_Classes_Helpers_Tools::setHeader( 'json' );

				if ( ! SQ_Classes_Helpers_Tools::userCan( 'sq_manage_focuspages' ) ) {
					echo wp_json_encode( array( 'error' => esc_html__( "You do not have permission to perform this action", 'squirrly-seo' ) ) );
					exit();
				}

				$inputs = SQ_Classes_Helpers_Tools::getValue( 'inputs', array() );

				if ( ! empty( $inputs ) && is_array( $inputs ) ) {
					foreach ( $inputs as $post_id ) {
						$post_id = (int) $post_id;
						if ( $post_id > 0 ) {
							SQ_Classes_RemoteController::deleteAuditPage( array( 'user_post_id' => $post_id ) );
						}
					}

					echo wp_json_encode( array( 'message' => esc_html__( "The selected pages were removed from GEO Audit.", 'squirrly-seo' ) ) );
				} else {
					echo wp_json_encode( array( 'error' => esc_html__( "Select at least one page first.", 'squirrly-seo' ) ) );
				}
				exit();
			case 'sq_ajax_audit_bulk_reaudit':

				SQ_Classes_Helpers_Tools::setHeader( 'json' );

				if ( ! SQ_Classes_Helpers_Tools::userCan( 'sq_manage_focuspages' ) ) {
					echo wp_json_encode( array( 'error' => esc_html__( "You do not have permission to perform this action", 'squirrly-seo' ) ) );
					exit();
				}

				$inputs = SQ_Classes_Helpers_Tools::getValue( 'inputs', array() );

				if ( ! empty( $inputs ) && is_array( $inputs ) ) {
					$sent = 0;
					foreach ( $inputs as $post_id ) {
						$post_id = (int) $post_id;
						if ( $post_id > 0 ) {
							$reaudit = SQ_Classes_RemoteController::updateAudit( array( 'post_id' => $post_id ) );
							if ( ! is_wp_error( $reaudit ) ) {
								$sent ++;
							}
						}
					}

					set_transient( 'sq_auditpage_all', time() );

					if ( $sent > 0 ) {
						echo wp_json_encode( array( 'message' => sprintf( esc_html__( "%d page(s) sent for re-audit. It may take a while so please be patient.", 'squirrly-seo' ), $sent ) ) );
					} else {
						echo wp_json_encode( array( 'error' => esc_html__( "Could not send the pages for re-audit. You can request one audit per page per hour.", 'squirrly-seo' ) ) );
					}
				} else {
					echo wp_json_encode( array( 'error' => esc_html__( "Select at least one page first.", 'squirrly-seo' ) ) );
				}
				exit();
		}

	}
}
