<?php

namespace SovereignStack\SecuritySafe;

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

/**
 * Class Threats.
 *
 * @package SecuritySafe
 * @since   2.0.0
 */
class Threats {

	/**
	 * Determines if the username is a threat
	 *
	 * @since  2.0.0
	 *
	 * @param string $username
	 *
	 * @return int
	 *
	 */
	public static function is_username( string $username ): int {

		$usernames = Yoda::get_bad_usernames();

		return in_array( strtolower( $username ), $usernames ) ? 1 : 0;
	}

	/**
	 * Determines if the filename is a threat
	 *
	 * @since  2.0.0
	 *
	 * @param string $filename
	 *
	 * @return int
	 *
	 */
	public static function is_filename( string $filename ): int {

		$matches_name = [
			'wp-config',
			'readme',
			'webconfig',
			'cgi-bin',
			'.git',
		];

		$threat = false;

		// Check for filename matches
		foreach( $matches_name as $key => $name ) {

			$threat = ( strpos( $filename, $name ) !== false ) ? true : $threat;

			if( $threat ) {
				break;
			}
		}

		return ( $threat ) ? 1 : 0;
	}

	/**
	 * Determines if the filename extention is a threat
	 *
	 * @since  2.4.0
	 *
	 * @param string $filename
	 *
	 * @return int
	 *
	 */
	public static function is_file_extention( string $filename ): int {

		// Check File Extentions
		$length = strlen( $filename );
		$ext_len = [
			4,
			5,
			7,
			3,
		]; // ordered in popularity

		$matches_ext = [
			'.zip' => '',
			// 4
			'.bzip' => '',
			// 5
			'.tar' => '',
			// 4
			'.tar.gz' => '',
			// 7
			'.gz' => '',
			// 3
			'.bak' => '',
			// 4
		];

		$threat = false;

		foreach( $ext_len as $l ) {

			if( $length >= $l ) {

				$ext = substr( $filename, - $l );

				$threat = ( isset( $matches_ext[ $ext ] ) ) ? true : $threat;

				if( $threat ) {
					break;
				}
			}
		}

		return ( $threat ) ? 1 : 0;
	}

	/**
	 * Determines if the filename is a threat
	 *
	 * @since  2.0.0
	 *
	 * @param string $uri
	 *
	 * @return int
	 *
	 */
	public static function is_uri( string $uri ): int {

		/**
		 * @todo finish detect uri threats
		 */

		return 0;
	}
}
