<?php

namespace Mpdf\Language;

class LanguageToFont implements \Mpdf\Language\LanguageToFontInterface
{

	public function getLanguageOptions($llcc, $adobeCJK)
	{
		$tags = explode('-', $llcc);
		$lang = strtolower($tags[0]);
		$country = '';
		$script = '';
		if (!empty($tags[1])) {
			if (strlen($tags[1]) === 4) {
				$script = strtolower($tags[1]);
			} else {
				$country = strtolower($tags[1]);
			}
		}
		if (!empty($tags[2])) {
			$country = strtolower($tags[2]);
		}

		$unifont = '';
		$coreSuitable = false;

		switch ($lang) {
			/* European */
			case 'en':
			case 'eng': // English		// LATIN
			case 'eu':
			case 'eus': // Basque
			case 'br':
			case 'bre': // Breton
			case 'ca':
			case 'cat': // Catalan
			case 'co':
			case 'cos': // Corsican
			case 'kw':
			case 'cor': // Cornish
			case 'cy':
			case 'cym': // Welsh
			case 'cs':
			case 'ces': // Czech
			case 'da':
			case 'dan': // Danish
			case 'nl':
			case 'nld': // Dutch
			case 'et':
			case 'est': // Estonian
			case 'fo':
			case 'fao': // Faroese
			case 'fi':
			case 'fin': // Finnish
			case 'fr':
			case 'fra': // French
			case 'gl':
			case 'glg': // Galician
			case 'de':
			case 'deu': // German
			case 'ht':
			case 'hat': // Haitian; Haitian Creole
			case 'hu':
			case 'hun': // Hungarian
			case 'ga':
			case 'gle': // Irish
			case 'is':
			case 'isl': // Icelandic
			case 'it':
			case 'ita': // Italian
			case 'la':
			case 'lat': // Latin
			case 'lb':
			case 'ltz': // Luxembourgish
			case 'li':
			case 'lim': // Limburgish
			case 'lt':
			case 'lit': // Lithuanian
			case 'lv':
			case 'lav': // Latvian
			case 'gv':
			case 'glv': // Manx
			case 'no':
			case 'nor': // Norwegian
			case 'nn':
			case 'nno': // Norwegian Nynorsk
			case 'nb':
			case 'nob': // Norwegian Bokmål
			case 'pl':
			case 'pol': // Polish
			case 'pt':
			case 'por': // Portuguese
			case 'ro':
			case 'ron': // Romanian
			case 'gd':
			case 'gla': // Scottish Gaelic
			case 'es':
			case 'spa': // Spanish
			case 'sv':
			case 'swe': // Swedish
			case 'sl':
			case 'slv': // Slovene
			case 'sk':
			case 'slk': // Slovak
				$coreSuitable = true;
				break;

			case 'ru':
			case 'rus': // Russian	// CYRILLIC
			case 'ab':
			case 'abk': // Abkhaz
			case 'av':
			case 'ava': // Avaric
			case 'ba':
			case 'bak': // Bashkir
			case 'be':
			case 'bel': // Belarusian
			case 'bg':
			case 'bul': // Bulgarian
			case 'ce':
			case 'che': // Chechen
			case 'cv':
			case 'chv': // Chuvash
			case 'kk':
			case 'kaz': // Kazakh
			case 'kv':
			case 'kom': // Komi
			case 'ky':
			case 'kir': // Kyrgyz
			case 'mk':
			case 'mkd': // Macedonian
			case 'cu':
			case 'chu': // Old Church Slavonic
			case 'os':
			case 'oss': // Ossetian
			case 'sr':
			case 'srp': // Serbian
			case 'tg':
			case 'tgk': // Tajik
			case 'tt':
			case 'tat': // Tatar
			case 'tk':
			case 'tuk': // Turkmen
			case 'uk':
			case 'ukr': // Ukrainian
				$unifont = 'dejavusanscondensed'; /* freeserif best coverage for supplements etc. */
				break;

			case 'hy':
			case 'hye': // ARMENIAN
				$unifont = 'dejavusans';
				break;
			case 'ka':
			case 'kat': // GEORGIAN
				$unifont = 'dejavusans';
				break;

			case 'el':
			case 'ell': // GREEK
				$unifont = 'dejavusanscondensed';
				break;
			case 'cop':  // COPTIC
				$unifont = 'quivira';
				break;

			case 'got':  // GOTHIC
				$unifont = 'freeserif';
				break;

			/* African */
			case 'nqo':  // NKO
				$unifont = 'dejavusans';
				break;
			//CASE 'bax':	// BAMUM
			//CASE 'ha':  CASE 'hau':	// Hausa
			case 'vai':  // VAI
				$unifont = 'freesans';
				break;
			case 'am':
			case 'amh': // Amharic ETHIOPIC
			case 'ti':
			case 'tir': // Tigrinya ETHIOPIC
					$unifont = 'abyssinicasil';
				break;

			/* Middle Eastern */
			case 'ar':
			case 'ara': // Arabic	NB Arabic text identified by Autofont will be marked as und-Arab
				$unifont = 'xbriyaz';
				break;
			case 'fa':
			case 'fas': // Persian (Farsi)
				$unifont = 'xbriyaz';
				break;
			case 'ps':
			case 'pus': // Pashto
				$unifont = 'xbriyaz';
				break;
			case 'ku':
			case 'kur': // Kurdish
				$unifont = 'xbriyaz';
				break;
			case 'ur':
			case 'urd': // Urdu
				$unifont = 'xbriyaz';
				break;
			case 'he':
			case 'heb': // HEBREW
			case 'yi':
			case 'yid': // Yiddish
					$unifont = 'taameydavidclm'; // dejavusans,dejavusanscondensed,freeserif are fine if you do not need cantillation marks
				break;

			case 'syr':  // SYRIAC
				$unifont = 'estrangeloedessa';
				break;

			//CASE 'arc':	// IMPERIAL_ARAMAIC
			//CASE ''ae:	// AVESTAN
			case 'xcr':  // CARIAN
				$unifont = 'aegean';
				break;
			case 'xlc':  // LYCIAN
				$unifont = 'aegean';
				break;
			case 'xld':  // LYDIAN
				$unifont = 'aegean';
				break;
			//CASE 'mid':	// MANDAIC
			//CASE 'peo':	// OLD_PERSIAN
			case 'phn':  // PHOENICIAN
				$unifont = 'aegean';
				break;
			//CASE 'smp':	// SAMARITAN
			case 'uga':  // UGARITIC
				$unifont = 'aegean';
				break;

			/* Central Asian */
			case 'bo':
			case 'bod': // TIBETAN
			case 'dz':
			case 'dzo': // Dzongkha
					$unifont = 'jomolhari';
				break;

			//CASE 'mn':  CASE 'mon':	// MONGOLIAN	(Vertical script)
			//CASE 'ug':  CASE 'uig':	// Uyghur
			//CASE 'uz':  CASE 'uzb':	// Uzbek
			//CASE 'az':  CASE 'azb':	// South Azerbaijani

			/* South Asian */
			case 'as':
			case 'asm': // Assamese
				$unifont = 'freeserif';
				break;
			case 'bn':
			case 'ben': // BENGALI; Bangla
				$unifont = 'freeserif';
				break;
			case 'ks':
			case 'kas': // Kashmiri
				$unifont = 'freeserif';
				break;
			case 'hi':
			case 'hin': // Hindi	DEVANAGARI
			case 'bh':
			case 'bih': // Bihari (Bhojpuri, Magahi, and Maithili)
			case 'sa':
			case 'san': // Sanskrit
							$unifont = 'freeserif';
				break;
			case 'gu':
			case 'guj': // Gujarati
				$unifont = 'freeserif';
				break;
			case 'pa':
			case 'pan': // Panjabi, Punjabi GURMUKHI
				$unifont = 'freeserif';
				break;
			case 'kn':
			case 'kan': // Kannada
				$unifont = 'lohitkannada';
				break;
			case 'mr':
			case 'mar': // Marathi
				$unifont = 'freeserif';
				break;
			case 'ml':
			case 'mal': // MALAYALAM
				$unifont = 'freeserif';
				break;
			case 'ne':
			case 'nep': // Nepali
				$unifont = 'freeserif';
				break;
			case 'or':
			case 'ori': // ORIYA
				$unifont = 'freeserif';
				break;
			case 'si':
			case 'sin': // SINHALA
				$unifont = 'kaputaunicode';
				break;
			case 'ta':
			case 'tam': // TAMIL
				$unifont = 'freeserif';
				break;
			case 'te':
			case 'tel': // TELUGU
				$unifont = 'pothana2000';
				break;

			// Sindhi (Arabic or Devanagari)
			case 'sd':
			case 'snd': // Sindhi
				$unifont = 'lateef';
				if ($country === 'IN') {
					$unifont = 'freeserif';
				}
				break;

			//CASE 'ccp':	// CHAKMA
			//CASE 'lep':	// LEPCHA
			case 'lif':  // LIMBU
				$unifont = 'sun-exta';
				break;
			//CASE 'sat':	// OL_CHIKI
			//CASE 'saz':	// SAURASHTRA
			case 'syl':  // SYLOTI_NAGRI
				$unifont = 'mph2bdamase';
				break;
			//CASE 'dgo':	// TAKRI
			case 'dv':
			case 'div': // Divehi; Maldivian  THAANA
				$unifont = 'freeserif';
				break;

			/* South East Asian */
			case 'km':
			case 'khm': // KHMER
				$unifont = 'khmeros';
				break;
			case 'lo':
			case 'lao': // LAO
				$unifont = 'dhyana';
				break;
			case 'my':
			case 'mya': // MYANMAR Burmese
				$unifont = 'tharlon'; // zawgyi-one is non-unicode compliant but in wide usage
				// ayar is also not strictly compliant
				// padaukbook is unicode compliant
				break;
			case 'th':
			case 'tha': // THAI
				$unifont = 'garuda';
				break;

			// VIETNAMESE
			case 'vi':
			case 'vie': // Vietnamese
				$unifont = 'dejavusanscondensed';
				break;

			//CASE 'ms':  CASE 'msa':	// Malay
			//CASE 'ban':	// BALINESE
			//CASE 'bya':	// BATAK
			case 'bug':  // BUGINESE
				$unifont = 'freeserif';
				break;
			//CASE 'cjm':	// CHAM
			//CASE 'jv':	// JAVANESE
			case 'su':  // SUNDANESE
				$unifont = 'sundaneseunicode';
				break;
			case 'tdd':  // TAI_LE
				$unifont = 'tharlon';
				break;
			case 'blt':  // TAI_VIET
				$unifont = 'taiheritagepro';
				break;

			/* Phillipine */
			case 'bku':  // BUHID
				$unifont = 'quivira';
				break;
			case 'hnn':  // HANUNOO
				$unifont = 'quivira';
				break;
			case 'tl':  // TAGALOG
				$unifont = 'quivira';
				break;
			case 'tbw':  // TAGBANWA
				$unifont = 'quivira';
				break;

			/* East Asian */
			case 'zh':
			case 'zho': // Chinese
				$unifont = 'sun-exta';
				if ($adobeCJK) {
					$unifont = 'gb';
					if ($country === 'HK' || $country === 'TW') {
						$unifont = 'big5';
					}
				}
				break;
			case 'ko':
			case 'kor': // HANGUL Korean
				$unifont = 'unbatang';
				if ($adobeCJK) {
					$unifont = 'uhc';
				}
				break;
			case 'ja':
			case 'jpn': // Japanese HIRAGANA KATAKANA
				$unifont = 'sun-exta';
				if ($adobeCJK) {
					$unifont = 'sjis';
				}
				break;
			case 'ii':
			case 'iii': // Nuosu; Yi
				$unifont = 'sun-exta';
				if ($adobeCJK) {
					$unifont = 'gb';
				}
				break;
			case 'lis':  // LISU
				$unifont = 'quivira';
				break;

			/* American */
			case 'chr':  // CHEROKEE
			case 'oj':
			case 'oji': // Ojibwe; Chippewa
			case 'cr':
			case 'cre': // Cree CANADIAN_ABORIGINAL
			case 'iu':
			case 'iku': // Inuktitut
				$unifont = 'aboriginalsans';
				break;

			/* Undetermined language - script used */
			case 'und':
				$unifont = self::fontByScript($script, $adobeCJK);
				break;
		}

		return [$coreSuitable, $unifont];
	}

	private static function fontByScript($script, $adobeCJK)
	{
		switch ($script) {
			/* European */
			case 'latn': // LATIN
				return 'dejavusanscondensed';
			case 'cyrl': // CYRILLIC
				return 'dejavusanscondensed'; /* freeserif best coverage for supplements etc. */
			case 'cprt': // CYPRIOT
				return 'aegean';
			case 'glag': // GLAGOLITIC
				return 'mph2bdamase';
			case 'linb': // LINEAR_B
				return 'aegean';
			case 'ogam': // OGHAM
				return 'dejavusans';
			case 'ital': // OLD_ITALIC
				return 'aegean';
			case 'runr': // RUNIC
				return 'sun-exta';
			case 'shaw': // SHAVIAN
				return 'mph2bdamase';

			/* African */
			case 'egyp': // EGYPTIAN_HIEROGLYPHS
				return 'aegyptus';
			case 'ethi': // ETHIOPIC
				return 'abyssinicasil';
			//CASE 'merc':	// MEROITIC_CURSIVE
			//CASE 'mero':	// MEROITIC_HIEROGLYPHS
			case 'osma': // OSMANYA
				return 'mph2bdamase';
			case 'tfng': // TIFINAGH
				return 'dejavusans';

			/* Middle Eastern */
			case 'arab':  // ARABIC
				return 'xbriyaz';
			case 'xsux': // CUNEIFORM
				return 'akkadian';
			//CASE 'sarb':	// OLD_SOUTH_ARABIAN
			//CASE 'prti':	// INSCRIPTIONAL_PARTHIAN
			//CASE 'phli':	// INSCRIPTIONAL_PAHLAVI


			/* Central Asian */
			//CASE 'orkh':	// OLD_TURKIC
			//CASE 'phag':	// PHAGS_PA		(Vertical script)

			/* South Asian */
			//CASE 'brah':	// BRAHMI
			//CASE 'kthi':	// KAITHI
			case 'khar': // KHAROSHTHI
				return 'mph2bdamase';
			case 'mtei': // MEETEI_MAYEK
				return 'eeyekunicode';
			//CASE 'shrd':	// SHARADA
			//CASE 'sora':	// SORA_SOMPENG

			/* South East Asian */
			case 'kali': // KAYAH_LI
				return 'freemono';
			//CASE 'rjng':	// REJANG
			case 'lana': // TAI_THAM
				return 'lannaalif';
			case 'talu': // NEW_TAI_LUE
				return 'daibannasilbook';

			/* East Asian */
			case 'hans': // HAN (SIMPLIFIED)
				if ($adobeCJK) {
					return 'gb';
				}
				return 'sun-exta';
			case 'bopo': // BOPOMOFO
				return 'sun-exta';
			//CASE 'plrd':	// MIAO
			case 'yiii': // YI
				return 'sun-exta';

			/* American */
			case 'dsrt': // DESERET
				return 'mph2bdamase';

			/* Other */
			case 'brai': // BRAILLE
				return 'dejavusans';
		}

		return null;
	}

}
