import 'package:flutter/widgets.dart';
import 'package:nc_photos/app_localizations.dart';
import 'package:nc_photos/entity/pref.dart';

class AppLanguage {
  const AppLanguage(this.langId, this._nativeName, this.isoName, this.locale);

  String get nativeName {
    if (langId == _AppLanguageEnum.systemDefault.index) {
      try {
        return L10n.global().settingsLanguageOptionSystemDefaultLabel;
      } catch (_) {
        return _nativeName;
      }
    } else {
      return _nativeName;
    }
  }

  final int langId;
  final String _nativeName;
  final String? isoName;
  final Locale? locale;
}

Locale? getSelectedLocale() => _getSelectedLanguage().locale;

final supportedLanguages = {
  _AppLanguageEnum.systemDefault.index: AppLanguage(
      _AppLanguageEnum.systemDefault.index, "System default", null, null),
  // sorted by alphabetic order of their ISO language names
  _AppLanguageEnum.catalan.index: AppLanguage(
      _AppLanguageEnum.catalan.index, "català", "Catalan", const Locale("ca")),
  _AppLanguageEnum.chineseHans.index: AppLanguage(
      _AppLanguageEnum.chineseHans.index,
      "中文 (简体)",
      "Chinese (Simplified)",
      const Locale.fromSubtags(languageCode: "zh", scriptCode: "Hans")),
  _AppLanguageEnum.chineseHant.index: AppLanguage(
      _AppLanguageEnum.chineseHant.index,
      "中文 (繁體/正體)",
      "Chinese (Traditional)",
      const Locale.fromSubtags(languageCode: "zh", scriptCode: "Hant")),
  _AppLanguageEnum.czech.index: AppLanguage(
      _AppLanguageEnum.czech.index, "Čeština", "Czech", const Locale("cs")),
  _AppLanguageEnum.dutch.index: AppLanguage(
      _AppLanguageEnum.dutch.index, "Nederlands", "Dutch", const Locale("nl")),
  _AppLanguageEnum.english.index: AppLanguage(
      _AppLanguageEnum.english.index, "English", "English", const Locale("en")),
  _AppLanguageEnum.finnish.index: AppLanguage(
      _AppLanguageEnum.finnish.index, "Suomi", "Finnish", const Locale("fi")),
  _AppLanguageEnum.french.index: AppLanguage(
      _AppLanguageEnum.french.index, "Français", "French", const Locale("fr")),
  _AppLanguageEnum.german.index: AppLanguage(
      _AppLanguageEnum.german.index, "Deutsch", "German", const Locale("de")),
  _AppLanguageEnum.greek.index: AppLanguage(
      _AppLanguageEnum.greek.index, "Ελληνικά", "Greek", const Locale("el")),
  _AppLanguageEnum.italian.index: AppLanguage(_AppLanguageEnum.italian.index,
      "Italiano", "Italian", const Locale("it")),
  _AppLanguageEnum.polish.index: AppLanguage(
      _AppLanguageEnum.polish.index, "Polski", "Polish", const Locale("pl")),
  _AppLanguageEnum.portuguese.index: AppLanguage(
      _AppLanguageEnum.portuguese.index,
      "Português",
      "Portuguese",
      const Locale("pt")),
  _AppLanguageEnum.russian.index: AppLanguage(
      _AppLanguageEnum.russian.index, "Русский", "Russian", const Locale("ru")),
  _AppLanguageEnum.spanish.index: AppLanguage(
      _AppLanguageEnum.spanish.index, "Español", "Spanish", const Locale("es")),
  _AppLanguageEnum.turkish.index: AppLanguage(
      _AppLanguageEnum.turkish.index, "Türkçe", "Turkish", const Locale("tr")),
};

enum _AppLanguageEnum {
  // the order must not be changed
  systemDefault,
  english,
  spanish,
  greek,
  french,
  russian,
  german,
  czech,
  finnish,
  polish,
  portuguese,
  chineseHans,
  chineseHant,
  italian,
  dutch,
  catalan,
  turkish,
}

AppLanguage _getSelectedLanguage() {
  try {
    final lang = Pref().getLanguageOr(0);
    return supportedLanguages[lang]!;
  } catch (_) {
    return supportedLanguages[_AppLanguageEnum.systemDefault.index]!;
  }
}