<?php

// phpcs:ignore Generic.Commenting.DocComment.MissingShort
/** @noinspection PhpIllegalPsrClassPathInspection */

namespace WPForms\Logger;

/**
 * Class Log.
 *
 * @since 1.6.3
 */
class Log {

	/**
	 * Repository.
	 *
	 * @since 1.6.3
	 *
	 * @var Repository
	 */
	private $repository;

	/**
	 * List table.
	 *
	 * @since 1.6.3
	 *
	 * @var ListTable
	 */
	private $list_table;

	/**
	 * Register log hooks.
	 *
	 * @since 1.6.3
	 */
	public function hooks() {

		$this->repository = new Repository();

		add_action( 'shutdown', [ $this->repository, 'save' ] );

		add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_styles' ] );
		add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_scripts' ] );
		add_action( 'wp_ajax_wpforms_get_log_record', [ $this, 'get_record' ] );
	}

	/**
	 * Enqueue styles.
	 *
	 * @since 1.6.3
	 */
	public function enqueue_styles() {

		if ( ! $this->is_logger_page() ) {
			return;
		}

		$min = wpforms_get_min_suffix();

		wp_enqueue_style(
			'wpforms-tools-logger',
			WPFORMS_PLUGIN_URL . "assets/css/logger{$min}.css",
			[],
			WPFORMS_VERSION
		);
	}

	/**
	 * Enqueue styles.
	 *
	 * @since 1.6.3
	 */
	public function enqueue_scripts() {

		if ( ! $this->is_logger_page() ) {
			return;
		}

		$min = wpforms_get_min_suffix();

		wp_enqueue_script(
			'wpforms-tools-logger',
			WPFORMS_PLUGIN_URL . "assets/js/admin/logger/logger{$min}.js",
			[ 'jquery', 'jquery-confirm', 'wp-util' ],
			WPFORMS_VERSION,
			true
		);
	}

	/**
	 * Get log types.
	 *
	 * @since 1.6.3
	 *
	 * @return array
	 */
	public static function get_log_types() {

		return [
			'conditional_logic' => esc_html__( 'Conditional Logic', 'wpforms-lite' ),
			'entry'             => esc_html__( 'Entries', 'wpforms-lite' ),
			'error'             => esc_html__( 'Errors', 'wpforms-lite' ),
			'log'               => esc_html__( 'Log', 'wpforms-lite' ),
			'payment'           => esc_html__( 'Payment', 'wpforms-lite' ),
			'provider'          => esc_html__( 'Providers', 'wpforms-lite' ),
			'security'          => esc_html__( 'Security', 'wpforms-lite' ),
			'spam'              => esc_html__( 'Spam', 'wpforms-lite' ),
			'translation'       => esc_html__( 'Translation', 'wpforms-lite' ),
		];
	}

	/**
	 * Determine if it is a Logs page.
	 *
	 * @since 1.6.3
	 *
	 * @return bool
	 */
	private function is_logger_page() {

		return wpforms_is_admin_page( 'tools', 'logs' );
	}

	/**
	 * Create new record.
	 *
	 * @since 1.6.3
	 *
	 * @param string       $title    Record title.
	 * @param string       $message  Record message.
	 * @param array|string $types    Array, string, or string separated by comma types.
	 * @param int          $form_id  Record form ID.
	 * @param int          $entry_id Record entry ID.
	 * @param int          $user_id  Record user ID.
	 */
	public function add( $title, $message, $types, $form_id = 0, $entry_id = 0, $user_id = 0 ) {

		$this->repository->add( $title, $message, $types, $form_id, $entry_id, $user_id );
	}

	/**
	 * Check if the database table exists.
	 * Used in \WPForms_Install::maybe_create_tables() during plugin installation.
	 *
	 * @since 1.8.7
	 *
	 * @return bool
	 */
	public function table_exists(): bool {

		// phpcs:ignore WPForms.Formatting.EmptyLineBeforeReturn.RemoveEmptyLineBeforeReturnStatement
		return $this->repository->table_exists();
	}

	/**
	 * Create table for logs.
	 *
	 * @since 1.6.3
	 */
	public function create_table() {

		if ( $this->table_exists() ) {
			return;
		}

		$this->repository->create_table();
	}

	/**
	 * Get ListView.
	 *
	 * @since 1.6.3
	 *
	 * @return ListTable
	 */
	public function get_list_table() { // phpcs:ignore WPForms.PHP.HooksMethod.InvalidPlaceForAddingHooks

		if ( ! $this->list_table ) {
			$this->list_table = new ListTable( $this->repository );

			add_action( 'admin_print_scripts', [ $this->list_table, 'popup_template' ] );
		}

		return $this->list_table;
	}

	/**
	 * Json config for detail information about log record.
	 *
	 * @since 1.6.3
	 */
	public function get_record() {

		if (
			! check_ajax_referer( 'wpforms-admin', 'nonce', false ) ||
			! wpforms_current_user_can()
		) {
			wp_send_json_error( esc_html__( 'You do not have permission.', 'wpforms-lite' ) );
		}

		$id = filter_input( INPUT_GET, 'recordId', FILTER_VALIDATE_INT );

		if ( ! $id ) {
			wp_send_json_error( esc_html__( 'Record ID not found', 'wpforms-lite' ), 404 );
		}

		$item = $this->repository->record( $id );

		if ( $item === null ) {
			wp_send_json_error( esc_html__( 'No such record.', 'wpforms-lite' ), 404 );
		}

		wp_send_json_success(
			[
				'ID'        => absint( $item->get_id() ),
				'title'     => esc_html( $item->get_title() ),
				'message'   => wp_kses( $item->get_message(), [ 'pre' => [] ] ),
				'types'     => esc_html( implode( ', ', $item->get_types( 'label' ) ) ),
				'create_at' => esc_html( $item->get_date( 'full' ) ),
				'form_id'   => absint( $item->get_form_id() ),
				'entry_id'  => absint( $item->get_entry_id() ),
				'user_id'   => absint( $item->get_user_id() ),
				'form_url'  => admin_url( sprintf( 'admin.php?page=wpforms-builder&view=fields&form_id=%d', absint( $item->get_form_id() ) ) ),
				'entry_url' => admin_url( sprintf( 'admin.php?page=wpforms-entries&view=details&entry_id=%d', absint( $item->get_entry_id() ) ) ),
				'user_url'  => esc_url( get_edit_user_link( $item->get_user_id() ) ),
			]
		);
	}
}
