package com.unibuy.smartdevice.structure;

import android.content.Context;

import com.unibuy.smartdevice.utils.LanguageHelper;

public class ProductStructure {
    private String productID;
    private String productImg;
    private String productName;
    private int machinePrice;
    private int sellingPrice;
    private int memberPrice;
    private int slotUpperLimit;
    private String marketingPlan;
    private String materialCode;
    private String productNameEn;
    private String productNameJp;

    public ProductStructure(String productID, String productImg, String productName, int machinePrice, int sellingPrice, int memberPrice, int slotUpperLimit, String marketingPlan, String materialCode,String productNameEn,String productNameJp) {
        this.productID = productID;
        this.productImg = productImg;
        this.productName = productName;
        this.machinePrice = machinePrice;
        this.sellingPrice = sellingPrice;
        this.memberPrice = memberPrice;
        this.slotUpperLimit = slotUpperLimit;
        this.marketingPlan = marketingPlan;
        this.materialCode = materialCode;
        this.productNameEn = productNameEn;
        this.productNameJp = productNameJp;
    }

    public String getProductID() {
        return this.productID;
    }

    public void setProductID(String productID) {
        this.productID = productID;
    }

    public String getProductImg() {
        return this.productImg;
    }

    public void setProductImg(String productImg) {
        this.productImg = productImg;
    }

    public String getProductName() {
        return this.productName;
    }

    public void setProductName(String productName) {
        this.productName = productName;
    }

    public int getMachinePrice() {
        return this.machinePrice;
    }

    public void setMachinePrice(int machinePrice) {
        this.machinePrice = machinePrice;
    }

    public int getSellingPrice() {
        return sellingPrice;
    }

    public void setSellingPrice(int sellingPrice) {
        this.sellingPrice = sellingPrice;
    }

    public int getMemberPrice() {
        return this.memberPrice;
    }

    public void setMemberPrice(int memberPrice) {
        this.memberPrice = memberPrice;
    }

    public int getSlotUpperLimit() {
        return this.slotUpperLimit;
    }

    public void setSlotUpperLimit(int slotUpperLimit) {
        this.slotUpperLimit = slotUpperLimit;
    }

    public String getMarketingPlan() {
        return this.marketingPlan;
    }

    public void setMarketingPlan(String marketingPlan) {
        this.marketingPlan = marketingPlan;
    }

    public String getMaterialCode() {
        return materialCode;
    }

    public void setMaterialCode(String materialCode) {
        this.materialCode = materialCode;
    }

    public String getProductNameEn() {
        return productNameEn;
    }

    public void setProductNameEn(String productNameEn) {
        this.productNameEn = productNameEn;
    }

    public String getProductNameJp() {
        return productNameJp;
    }

    public void setProductNameJp(String productNameJp) {
        this.productNameJp = productNameJp;
    }

    // B012 t060v01_i18n 原始 JSON 字串（底線代碼 key，如 {"zh_TW":..,"en":..,"ko":..}）。
    // 由 B012 解析時設入；離線從 DB 重新載入商品時此欄為空，改向 MyApp 持久化 blob 取。
    private String nameI18nJson;

    public String getNameI18nJson() {
        return nameI18nJson;
    }

    public void setNameI18nJson(String nameI18nJson) {
        this.nameI18nJson = nameI18nJson;
    }

    // 依目前語言取商品名稱。優先順序：
    // 1) B012 多語 map 對應語系 → 2) map 的 zh_TW → 3) 舊欄位 _en/_jp（向下相容）→ 4) 中文主值。
    // 所有顯示商品名稱的地方都應呼叫這個方法，避免各自重複判斷導致顯示不一致。
    public String getLocalizedName(Context context) {
        String canonical = LanguageHelper.getSavedLanguage(context);   // zh-TW / en / ko ...
        String backendLocale = LanguageHelper.toBackendLocale(canonical); // zh_TW / en / ko ...

        // 1) 商品多語 map：目前語系
        String fromMap = lookupNameI18n(backendLocale);
        if (notBlank(fromMap)) return fromMap;

        // 2) 商品多語 map：zh_TW（後台保證的 fallback 主值）
        if (!"zh_TW".equals(backendLocale)) {
            String zh = lookupNameI18n("zh_TW");
            if (notBlank(zh)) return zh;
        }

        // 3) 舊欄位 _en/_jp（線上舊資料相容；新 map 缺時兜底）
        String productLang = LanguageHelper.toProductLang(canonical);  // en / ja / zh
        if ("en".equals(productLang) && notBlank(productNameEn)) return productNameEn;
        if ("ja".equals(productLang) && notBlank(productNameJp)) return productNameJp;

        // 4) 中文主值
        return productName;
    }

    // 從 i18n map 取指定後台 locale 的名稱；本物件欄位為空時改向 MyApp 持久化 blob 取（離線重啟）。
    private String lookupNameI18n(String backendLocale) {
        String json = nameI18nJson;
        if (json == null || json.isEmpty()) {
            json = com.unibuy.smartdevice.MyApp.getInstance().getProductNameI18nJson(productID);
        }
        if (json == null || json.isEmpty()) return null;
        try {
            return new org.json.JSONObject(json).optString(backendLocale, null);
        } catch (org.json.JSONException e) {
            return null;
        }
    }

    // B012 t060v03_i18n 原始 JSON 字串（底線代碼 key，如 {"zh_TW":..,"en":..}）。
    // 內容為純文字含換行（\n），顯示時以 setText 原樣呈現（保留換行/空格/縮排）。
    // 由 B012 解析時設入；離線從 DB 重新載入商品時此欄為空，改向 MyApp 持久化 blob 取。
    private String specI18nJson;

    public String getSpecI18nJson() {
        return specI18nJson;
    }

    public void setSpecI18nJson(String specI18nJson) {
        this.specI18nJson = specI18nJson;
    }

    // 依目前語言取商品規格／描述。順序：對應語系 → zh_TW → 空字串（無描述）。
    public String getLocalizedSpec(Context context) {
        String canonical = LanguageHelper.getSavedLanguage(context);
        String backendLocale = LanguageHelper.toBackendLocale(canonical);

        String fromMap = lookupSpecI18n(backendLocale);
        if (notBlank(fromMap)) return fromMap;

        if (!"zh_TW".equals(backendLocale)) {
            String zh = lookupSpecI18n("zh_TW");
            if (notBlank(zh)) return zh;
        }
        return "";
    }

    private String lookupSpecI18n(String backendLocale) {
        String json = specI18nJson;
        if (json == null || json.isEmpty()) {
            json = com.unibuy.smartdevice.MyApp.getInstance().getProductSpecI18nJson(productID);
        }
        if (json == null || json.isEmpty()) return null;
        try {
            return new org.json.JSONObject(json).optString(backendLocale, null);
        } catch (org.json.JSONException e) {
            return null;
        }
    }

    // ===== 履帶/彈簧 補貨上限 =====
    // 一鍵補貨依貨道型式取不同上限：履帶用 trackLimit、彈簧用 springLimit。
    // trackLimit = slotUpperLimit（B012 t060v11，本來就等於後台 track_limit），沿用既有持久化。
    // springLimit = B012 spring_limit；由 saveProducts 設入。離線從 DB 重載商品時此欄為 -1，
    // 改向 MyApp 持久化 blob 取；blob 也缺時退回履帶上限（維持舊行為，不會把數量補成 0）。
    private int springLimit = -1;

    public void setSpringLimit(int springLimit) {
        this.springLimit = springLimit;
    }

    /** 履帶貨道補貨上限（= slotUpperLimit = 後台 track_limit）。 */
    public int getTrackLimit() {
        return this.slotUpperLimit;
    }

    /** 彈簧貨道補貨上限。本物件欄位缺時向 MyApp 持久化 blob 取；再缺則退回履帶上限。 */
    public int getSpringLimit() {
        if (springLimit >= 0) return springLimit;
        int fromBlob = com.unibuy.smartdevice.MyApp.getInstance().getProductSpringLimit(productID);
        if (fromBlob >= 0) return fromBlob;
        return this.slotUpperLimit;
    }

    private static boolean notBlank(String s) {
        return s != null && !s.trim().isEmpty();
    }

    public int getRealPrice() {
        int machinePrice = getMachinePrice();
        int sellingPrice = getSellingPrice();
        int memberPrice = getMemberPrice();
        int price = machinePrice > 0 ? machinePrice : sellingPrice;
        return price;
    }

    @Override
    public String toString() {
        return "ProductStructure {" +
                "productID='" + productID + '\'' +
                ", productImg='" + productImg + '\'' +
                ", productName='" + productName + '\'' +
                ", machinePrice=" + machinePrice +
                ", sellingPrice=" + sellingPrice +
                ", memberPrice=" + memberPrice +
                ", slotUpperLimit=" + slotUpperLimit +
                ", marketingPlan='" + marketingPlan + '\'' +
                ", materialCode='" + materialCode + '\'' +
                ", productNameEn='" + productNameEn + '\'' +
                ", productNameJp='" + productNameJp + '\'' +
                '}';
    }
}
