<?php

namespace XF\Data;

use XF\Util\Arr;

class CodeLanguage
{
	public function getSupportedLanguages($filterDisabled = false)
	{
		$languages = [
			'apacheconf' => [],
			'bash' => [
				'modes' => 'shell',
			],
			'c' => [
				'modes' => 'clike',
				'mime' => 'text/x-csrc',
			],
			'clike' => [
				'modes' => 'clike',
				'mime' => 'text/x-csrc',
			],
			'coffeescript' => [
				'modes' => 'coffeescript',
			],
			'cpp' => [
				'modes' => 'clike',
				'mime' => 'text/x-c++src',
			],
			'csharp' => [
				'modes' => 'clike',
				'mime' => 'text/x-csharp',
			],
			'css' => [
				'modes' => 'css',
				'common' => true,
			],
			'diff' => [
				'modes' => 'diff',
			],
			'html' => [
				'addons' => [
					'edit/closetag',
					'fold/xml-fold',
				],
				'config' => [
					'autoCloseTags' => true,
				],
				'modes' => [
					'htmlmixed',
					'css',
					'javascript',
					'xml',
				],
				'common' => true,
			],
			'http' => [
				'modes' => 'http',
			],
			'ini' => [],
			'java' => [
				'modes' => 'clike',
				'mime' => 'text/x-java',
			],
			'javascript' => [
				'modes' => 'javascript',
				'common' => true,
			],
			'json' => [
				'modes' => 'javascript',
				'config' => [
					'json' => true,
				],
			],
			'less' => [
				'modes' => 'css',
				'mime' => 'text/x-less',
			],
			'makefile' => [],
			'markdown' => [
				'addons' => [
					'mode/overlay',
					'edit/closetag',
					'fold/markdown-fold',
					'fold/xml-fold',
				],
				'config' => [
					'autoCloseTags' => true,
				],
				'modes' => [
					'gfm',
					'clike',
					'css',
					'htmlmixed',
					'javascript',
					'markdown',
					'php',
					'xml',
				],
			],
			'nginx' => [
				'modes' => 'nginx',
			],
			'objectivec' => [
				'modes' => 'clike',
				'mime' => 'text/x-objectivec',
			],
			'perl' => [
				'modes' => 'perl',
			],
			'php' => [
				'modes' => [
					'clike',
					'php',
				],
				'mime' => 'text/x-php',
				'common' => true,
			],
			'python' => [
				'modes' => 'python',
			],
			'ruby' => [
				'modes' => 'ruby',
			],
			'sass' => [
				'modes' => 'sass',
			],
			'scss' => [
				'modes' => 'css',
				'mime' => 'text/x-scss',
			],
			'sql' => [
				'modes' => 'sql',
				'mime' => 'text/x-mysql',
			],
			'svg' => [],
			'swift' => [
				'modes' => 'swift',
			],
			'xml' => [
				'modes' => 'xml',
				'config' => [
					'htmlMode' => false,
				],
			],
		];

		$enabledLanguages = Arr::stringToArray(\XF::options()->allowedCodeLanguages, '/\r?\n/');

		foreach ($enabledLanguages AS $language)
		{
			if (isset($languages[$language]))
			{
				// we have some sort of code editor definition for this language
				// so we can just skip doing anything here.
				continue;
			}
			else
			{
				// this adds the supported language into the code editor, but will not add
				// any custom definition for the code editor (essentially, no syntax highlighting)
				$languages[$language] = [];
			}
		}

		array_walk($languages, function (&$language, $key)
		{
			$language['phrase'] = \XF::phrase('code_language.' . $key);
			return $language;
		});

		\XF::app()->fire('code_languages', [&$languages]);

		if ($filterDisabled)
		{
			$languages = array_intersect_key($languages, array_flip($enabledLanguages));
		}

		ksort($languages);

		return $languages;
	}
}
