import 'package:flutter/material.dart';
import 'package:get/get.dart';
// import 'package:google_fonts/google_fonts.dart';

import '../../app/data/sp/ix_sp.dart';
// import 'ar_AR/ar_ar_translation.dart';
import 'en_US/en_us_translation.dart';
// import 'es_ES/es_es_translation.dart';
// import 'my_MM/my_mm_translation.dart';
// import 'fa_IR/fa_ir_translation.dart';
// import 'de_DE/de_de_translation.dart';
// import 'ja_JP/ja_jp_translation.dart';
// import 'fr_FR/fr_fr_translation.dart';
// import 'ru_RU/ru_ru_translation.dart';
// import 'ko_KR/ko_kr_translation.dart';
// import 'zh_TW/zh_tw_translation.dart';
import 'zh_CN/zh_cn_translation.dart';
// import 'tk_TM/tk_tm_translation.dart';
// import 'pt_BR/pt_br_translation.dart';
// import 'vi_VN/vi_vn_translation.dart';
// import 'id_ID/id_id_translation.dart';
// import 'tl_PH/tl_ph_translation.dart';
// import 'th_TH/th_th_translation.dart';
// import 'hi_IN/hi_in_translation.dart';
// import 'tr_TR/tr_tr_translation.dart';
import 'strings_enum.dart';

class LocalizationService extends Translations {
  // prevent creating instance
  LocalizationService._();

  static LocalizationService? _instance;

  static LocalizationService getInstance() {
    _instance ??= LocalizationService._();
    return _instance!;
  }

  // 根据系统语言获取默认语言
  static Locale getDefaultLanguage() {
    // 获取系统语言代码
    final String deviceLanguage =
        WidgetsBinding.instance.platformDispatcher.locale.languageCode;

    // 检查系统语言是否在支持的语言列表中
    if (isLanguageSupported(deviceLanguage)) {
      return supportedLanguages[deviceLanguage]!;
    }

    // 如果系统语言不受支持，则返回英语作为默认语言
    return supportedLanguages['en']!;
  }

  // 获取系统国家
  static String getSystemCountry() {
    return WidgetsBinding.instance.platformDispatcher.locale.countryCode ?? '';
  }

  // default language
  // todo change the default language
  static Locale defaultLanguage = getDefaultLanguage();

  static final all = [
    const Locale('en'), // 英语
    // const Locale('es'), // 西班牙语
    // const Locale('ar'), // 阿拉伯语
    // const Locale('de'), // 德语
    // const Locale('ja'), // 日语
    // const Locale('fr'), // 法语
    // const Locale('ru'), // 俄语
    // const Locale('ko'), // 韩语
    // const Locale('fa'), // 波斯语
    // const Locale('my'), // 缅甸语
    // const Locale('zh', 'TW'), // 繁体中文
    // const Locale('zh', 'CN'), // 简体中文
    // const Locale('tk'), // 土库曼语
    // const Locale('pt', 'BR'), // 葡萄牙语-巴西
    // const Locale('vi'), // 越南语
    // const Locale('id'), // 印尼语
    // const Locale('tl'), // 菲律宾语
    // const Locale('th'), // 泰语
    // const Locale('hi'), // 印地语
    // const Locale('tr'), // 土耳其语
  ];

  // supported languages
  static Map<String, Locale> supportedLanguages = {
    'en': const Locale('en', 'US'),
    // 'es': const Locale('es', 'ES'),
    // 'ar': const Locale('ar', 'AR'),
    // 'de': const Locale('de', 'DE'),
    // 'ja': const Locale('ja', 'JP'),
    // 'fr': const Locale('fr', 'FR'),
    // 'ru': const Locale('ru', 'RU'),
    // 'ko': const Locale('ko', 'KR'),
    // 'fa': const Locale('fa', 'IR'),
    // 'my': const Locale('my', 'MM'),
    'zh': const Locale('zh', 'CN'), // 默认简体中文（系统语言检测用）
    // 'zh_TW': const Locale('zh', 'TW'), // 繁体中文
    'zh_CN': const Locale('zh', 'CN'), // 简体中文（语言选择器用）
    // 'tk': const Locale('tk', 'TM'),
    // 'pt': const Locale('pt', 'BR'),
    // 'vi': const Locale('vi', 'VN'),
    // 'id': const Locale('id', 'ID'),
    // 'tl': const Locale('tl', 'PH'),
    // 'th': const Locale('th', 'TH'),
    // 'hi': const Locale('hi', 'IN'),
    // 'tr': const Locale('tr', 'TR'),
  };

  // supported languages fonts family (must be in assets & pubspec yaml) or you can use google fonts
  static Map<String, TextStyle> supportedLanguagesFontsFamilies = {
    // 'en': GoogleFonts.poppins(),
    // 'es': GoogleFonts.poppins(),
    // 'ar': GoogleFonts.cairo(),
    // 'fa': GoogleFonts.vazirmatn(),
    // 'my': GoogleFonts.notoSansMyanmar(),
    'en': const TextStyle(fontFamily: 'Inter'),
    // 'es': const TextStyle(fontFamily: 'FiraSans'),
    // 'ar': const TextStyle(fontFamily: 'Vazirmatn'),
    // 'de': const TextStyle(fontFamily: 'FiraSans'),
    // 'ja': const TextStyle(fontFamily: 'FiraSans'),
    // 'fr': const TextStyle(fontFamily: 'FiraSans'),
    // 'ru': const TextStyle(fontFamily: 'FiraSans'),
    // 'ko': const TextStyle(fontFamily: 'FiraSans'),
    // 'fa': const TextStyle(fontFamily: 'Vazirmatn'),
    // 'my': const TextStyle(fontFamily: 'NotoSansMyanmar'),
    'zh': const TextStyle(fontFamily: 'FiraSans'),
    // 'zh_TW': const TextStyle(fontFamily: 'FiraSans'),
    'zh_CN': const TextStyle(fontFamily: 'FiraSans'),
    // 'tk': const TextStyle(fontFamily: 'FiraSans'),
    // 'pt': const TextStyle(fontFamily: 'FiraSans'),
    // 'vi': const TextStyle(fontFamily: 'FiraSans'),
    // 'id': const TextStyle(fontFamily: 'FiraSans'),
    // 'tl': const TextStyle(fontFamily: 'FiraSans'),
    // 'th': const TextStyle(fontFamily: 'FiraSans'),
    // 'hi': const TextStyle(fontFamily: 'FiraSans'),
    // 'tr': const TextStyle(fontFamily: 'FiraSans'),
  };

  @override
  Map<String, Map<String, String>> get keys => {
    'en_US': enUs,
    // 'es_ES': esEs,
    // 'ar_AR': arAR,
    // 'de_DE': deDE,
    // 'ja_JP': jaJP,
    // 'fr_FR': frFR,
    // 'ru_RU': ruRU,
    // 'ko_KR': koKR,
    // 'fa_IR': faIR,
    // 'my_MM': myMM,
    // 'zh_TW': zhTW,
    'zh_CN': zhCN,
    // 'tk_TM': tkTM,
    // 'pt_BR': ptBR,
    // 'vi_VN': viVN,
    // 'id_ID': idID,
    // 'tl_PH': tlPH,
    // 'th_TH': thTH,
    // 'hi_IN': hiIN,
    // 'tr_TR': trTR,
  };

  /// check if the language is supported
  static isLanguageSupported(String languageCode) =>
      supportedLanguages.keys.contains(languageCode);

  /// update app language by code language for example (en,ar..etc)
  static updateLanguage(String languageCode) async {
    // check if the language is supported
    if (!isLanguageSupported(languageCode)) return;
    // update current language in shared pref
    await IXSP.setCurrentLanguage(languageCode);
    if (!Get.testMode) {
      Get.updateLocale(supportedLanguages[languageCode]!);
    }
  }

  /// check if the language is english
  static bool isItEnglish() =>
      IXSP.getCurrentLocal().languageCode.toLowerCase().contains('en');

  /// check if the language is zh_cn
  static bool isChinese() =>
      IXSP.getCurrentLocal().languageCode.toLowerCase().contains('zh');

  /// get current locale
  static Locale getCurrentLocal() => IXSP.getCurrentLocal();

  /// 检测指定的[languageCode]是否从右往左(RTL)布局
  static bool isRTL() {
    switch (getCurrentLocal().languageCode) {
      case 'ar':
      case 'fa':
      case 'he':
        return true;
      default:
        return false;
    }
  }

  /// 获取本地化配置[locale]中的语言简称
  static String getGlobalLanguageTitle({Locale? locale}) {
    final currentLocale = locale ?? getCurrentLocal();
    final languageCode = currentLocale.languageCode.toLowerCase();
    final countryCode = currentLocale.countryCode?.toUpperCase() ?? '';

    // 中文需要区分简体和繁体
    if (languageCode == 'zh') {
      return countryCode == 'TW' ? Strings.zhTWLang.tr : Strings.zhCNLang.tr;
    }

    switch (languageCode) {
      case 'en':
        return Strings.enLang.tr;
      case 'es':
        return Strings.esLang.tr;
      case 'ar':
        return Strings.arLang.tr;
      case 'de':
        return Strings.deLang.tr;
      case 'ja':
        return Strings.jaLang.tr;
      case 'fr':
        return Strings.frLang.tr;
      case 'ru':
        return Strings.ruLang.tr;
      case 'ko':
        return Strings.koLang.tr;
      case 'fa':
        return Strings.faLang.tr;
      case 'my':
        return Strings.myLang.tr;
      case 'tk':
        return Strings.tkLang.tr;
      case 'pt':
        return Strings.ptBRLang.tr;
      case 'vi':
        return Strings.viLang.tr;
      case 'id':
        return Strings.idLang.tr;
      case 'tl':
        return Strings.tlLang.tr;
      case 'th':
        return Strings.thLang.tr;
      case 'hi':
        return Strings.hiLang.tr;
      case 'tr':
        return Strings.trLang.tr;
      default:
        return 'Unknown';
    }
  }

  /// 获取本地化配置[locale]中的语言全称
  static String getGlobalLanguageName({Locale? locale}) {
    final currentLocale = locale ?? getCurrentLocal();
    final languageCode = currentLocale.languageCode.toLowerCase();
    final countryCode = currentLocale.countryCode?.toUpperCase() ?? '';

    // 中文需要区分简体和繁体
    if (languageCode == 'zh') {
      return countryCode == 'TW' ? '繁體中文' : '简体中文';
    }

    switch (languageCode) {
      case 'en':
        return 'English';
      case 'tr':
        return 'Türkçe';
      case 'vi':
        return 'Tiếng Việt';
      case 'uk':
        return 'Українська';
      case 'es':
        return 'Español';
      case 'ru':
        return 'Русский';
      case 'pt':
        return 'Português (Brasil)';
      case 'pl':
        return 'Polski';
      case 'ko':
        return '한국어';
      case 'ja':
        return '日本語';
      case 'it':
        return 'Italiano';
      case 'id':
        return 'Bahasa Indonesia';
      case 'de':
        return 'Deutsch';
      case 'fr':
        return 'Français';
      case 'fa':
        return 'فارسی';
      case 'hi':
        return 'हिन्दी';
      case 'ar':
        return 'عربي';
      case 'my':
        return 'မြန်မာဘာသာ';
      case 'tk':
        return 'Türkmençe';
      case 'tl':
        return 'Filipino';
      case 'th':
        return 'ไทย';
      default:
        return 'Unknown';
    }
  }
}
