	/**
	 * The language content
	 *
	 * @var    array
	 * @since 3.2.0
	 **/
	protected array $content = [];

	/**
	 * Compiler Config
	 *
	 * @var    Config
	 * @since 3.2.0
	 **/
	protected Config $config;

	/**
	 * Constructor.
	 *
	 * @param Config|null          $config           The compiler config object.
	 *
	 * @since 3.2.0
	 */
	public function __construct(?Config $config = null)
	{
		$this->config = $config ?: Compiler::_('Config');
	}

	/**
	 * Get the language string key
	 *
	 * @param   string  $string  The plan text string (English)
	 *
	 * @return  string   The key language string (all uppercase)
	 * @since 3.2.0
	 */
	public function key($string): string
	{
		// this is there to insure we don't break already added Language strings
		if (StringHelper::safe($string, 'U', '_', false, false)
			=== $string)
		{
			return false;
		}

		// build language key
		$key_lang = $this->config->lang_prefix . '_' . StringHelper::safe(
				$string, 'U'
			);

		// set the language string
		$this->set($this->config->lang_target, $key_lang, $string);

		return $key_lang;
	}

	/**
	 * check if the language string exist
	 *
	 * @param   string   $target     The target area for the language string
	 * @param   string|null   $language   The language key string
	 *
	 * @return  bool
	 * @since 3.2.0
	 */
	public function exist(string $target, ?string $language = null): bool
	{
		if ($language)
		{
			return isset($this->content[$target][$language]);
		}
		
		return isset($this->content[$target]);
	}

	/**
	 * get the language string
	 *
	 * @param   string   $target     The target area for the language string
	 * @param   string|null   $language   The language key string
	 *
	 * @return  Mixed The language string found or empty string if none is found
	 * @since 3.2.0
	 */
	public function get(string $target, string $language): string
	{
		if (isset($this->content[$target][$language]))
		{
			return $this->content[$target][$language];
		}

		return '';
	}

	/**
	 * get target array
	 *
	 * @param   string   $target     The target area for the language string
	 *
	 * @return  array The target array or empty array if none is found
	 * @since 3.2.0
	 */
	public function getTarget(string $target): array
	{
		if (isset($this->content[$target]) && ArrayHelper::check($this->content[$target]))
		{
			return $this->content[$target];
		}

		return [];
	}

	/**
	 * set target array
	 *
	 * @param string      $target     The target area for the language string
	 * @param array|null  $content    The language content string
	 *
	 * @return  void
	 * @since 3.2.0
	 */
	public function setTarget(string $target, ?array $content)
	{
		$this->content[$target] = $content;
	}

	/**
	 * set the language content values to language content array
	 *
	 * @param   string   $target     The target area for the language string
	 * @param   string   $language   The language key string
	 * @param   string   $string     The language string
	 * @param   bool  $addPrefix  The switch to add langPrefix
	 *
	 * @return  void
	 * @since 3.2.0
	 */
	public function set(string $target, string $language, string $string, bool $addPrefix = false)
	{
		if ($addPrefix && empty(
				$this->content[$target][$this->config->lang_prefix . '_' . $language]
			))
		{
			$this->content[$target][$this->config->lang_prefix . '_' . $language]
				= $this->fix($string);
		}
		elseif (empty($this->content[$target][$language]))
		{
			$this->content[$target][$language] = $this->fix(
				$string
			);
		}
	}

	/**
	 * We need to remove all text breaks from all language strings
	 *
	 * @param   string  $string  The language string
	 *
	 * @return  string
	 * @since 3.2.0
	 */
	protected function fix(string $string): string
	{
		if ($this->config->remove_line_breaks)
		{
			return trim(str_replace(array(PHP_EOL, "\r", "\n"), '', $string));
		}

		return trim($string);
	}
