package com.unibuy.smartdevice.utils;

import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Build;

import java.util.Locale;

public class LanguageHelper {
    private static final String PREFS_NAME = "app_prefs";
    private static final String KEY_LANGUAGE = "language";

    // App 介面支援的語系（顯示順序）。對應 res/values-* 資料夾：
    // zh-TW=values(預設,繁中)、zh-CN=values-zh-rCN、en、ja、ko、vi、th、id(=values-in)。
    public static final String[] SUPPORTED_LANGUAGES = {
            "zh-TW", "zh-CN", "en", "ja", "ko", "vi", "th", "id", "fr", "de", "es"
    };

    // 各語系以「該語言自己的文字」顯示的名稱（給語言選單用）
    public static String getDisplayName(String code) {
        switch (canonicalize(code)) {
            case "zh-TW": return "中文（繁體）";
            case "zh-CN": return "中文（简体）";
            case "en":    return "English";
            case "ja":    return "日本語";
            case "ko":    return "한국어";
            case "vi":    return "Tiếng Việt";
            case "th":    return "ภาษาไทย";
            case "id":    return "Bahasa Indonesia";
            case "fr":    return "Français";
            case "de":    return "Deutsch";
            case "es":    return "Español";
            default:      return code;
        }
    }

    // 將各種歷史/縮寫代碼正規化成標準 UI 語系標籤（含 region）。
    // 舊資料相容：tw→zh-TW、jp→ja、單獨 zh→zh-TW（過去預設為繁中）。
    public static String canonicalize(String code) {
        if (code == null || code.trim().isEmpty()) {
            return fromLocale(Locale.getDefault());
        }
        String c = code.trim().toLowerCase(Locale.ROOT).replace('_', '-');
        switch (c) {
            case "zh-tw":
            case "zh-hant":
            case "zh-hant-tw":
            case "tw":
            case "zh":      // 過去單獨 zh 一律視為繁中
                return "zh-TW";
            case "zh-cn":
            case "zh-hans":
            case "zh-hans-cn":
            case "cn":
                return "zh-CN";
            case "ja":
            case "jp":
                return "ja";
            case "ko":
            case "kr":
                return "ko";
            case "vi":
            case "vn":
                return "vi";
            case "th":
                return "th";
            case "id":
            case "in":      // Android/Java 對印尼文的舊代碼
                return "id";
            case "fr":
                return "fr";
            case "de":
                return "de";
            case "es":
                return "es";
            default:
                if (c.startsWith("en")) return "en";
                if (c.startsWith("zh")) return "zh-TW";
                return "zh-TW";
        }
    }

    private static String fromLocale(Locale locale) {
        String lang = locale.getLanguage();
        if ("zh".equals(lang)) {
            String region = locale.getCountry();
            return ("CN".equalsIgnoreCase(region) || "SG".equalsIgnoreCase(region)) ? "zh-CN" : "zh-TW";
        }
        // in = 印尼文舊代碼，統一回 id
        if ("in".equals(lang)) return "id";
        return canonicalize(lang);
    }

    // 由 UI 語系標籤建立對應的 Locale（處理 region 與印尼文資源代碼）
    private static Locale buildLocale(String canonical) {
        switch (canonical) {
            case "zh-TW": return new Locale("zh", "TW");
            case "zh-CN": return new Locale("zh", "CN");
            case "id":    return new Locale("id"); // 系統會對應到 res/values-in
            default:      return new Locale(canonical);
        }
    }

    // App 標準語系標籤(zh-TW) → 後台 locale 代碼(zh_TW)。後台一律用底線格式。
    public static String toBackendLocale(String code) {
        return canonicalize(code).replace('-', '_');
    }

    // 語言選單的語系來源：優先用後台 B014 LangSet 下發的「機台啟用語系」，
    // 尚未取得（離線/未綁定）時退回全部 SUPPORTED_LANGUAGES。回傳標準標籤。
    public static String[] getMachineLanguages() {
        java.util.List<String> machine = com.unibuy.smartdevice.MyApp.getInstance().getMachineLanguages();
        if (machine != null && !machine.isEmpty()) {
            return machine.toArray(new String[0]);
        }
        return SUPPORTED_LANGUAGES;
    }

    // 供商品名稱等資料層使用：後台目前只有 中/英/日 三語，
    // 其餘語言（簡中/韓/越/泰/印尼）一律 fallback 回中文主值。
    public static String toProductLang(String code) {
        String c = canonicalize(code);
        if (c.startsWith("en")) return "en";
        if (c.equals("ja")) return "ja";
        return "zh";
    }

    // 取得目前已儲存、且正規化為商品資料用的語言代碼（zh/en/ja）
    public static String normalizedLang(Context context) {
        return toProductLang(getSavedLanguage(context));
    }

    // 切換語言
    public static void changeLanguage(Context context, String languageCode) {
        String canonical = canonicalize(languageCode);
        Locale locale = buildLocale(canonical);
        Locale.setDefault(locale);

        Resources resources = context.getResources();
        Configuration config = resources.getConfiguration();

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            config.setLocale(locale);
        } else {
            config.locale = locale;
        }

        resources.updateConfiguration(config, resources.getDisplayMetrics());

        // 保存語言設定（一律存正規化後的標準標籤）
        saveLanguagePreference(context, canonical);
    }

    // 保存語言到 SharedPreferences
    private static void saveLanguagePreference(Context context, String languageCode) {
        SharedPreferences prefs = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
        prefs.edit().putString(KEY_LANGUAGE, languageCode).apply();
    }

    // 讀取語言設定（回傳正規化後的標準標籤）
    public static String getSavedLanguage(Context context) {
        SharedPreferences prefs = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
        String saved = prefs.getString(KEY_LANGUAGE, null);
        return canonicalize(saved);
    }

    // 初始化語言（在 App 啟動時呼叫）
    public static void applySavedLanguage(Context context) {
        changeLanguage(context, getSavedLanguage(context));
    }
}
