package com.unibuy.smartdevice.ui.tools;

import android.content.Context;
import android.graphics.Color;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

import com.unibuy.smartdevice.database.SettingsDao;
import com.unibuy.smartdevice.structure.SettingStructure;

import org.json.JSONObject;

import java.util.Iterator;
import java.util.List;

/**
 * 後台「APP UI 元素設定」換膚：把 B014 下發的 UISet（部位 part_key → 圖片 URL）
 * 落地到 SettingsDao，並提供把某部位圖片套到任一 ImageView 的方法。
 *
 * 儲存格式：settingId = {@link #SETTING_ID}，每個部位一列 data = [part_key, url]。
 * 部位無設定時保留該 view 原本的 XML 預設圖（不覆蓋）。
 */
public class UiSkin {
    public static final String SETTING_ID = "UISkin";

    /**
     * 解析並落地 B014 的 UISet。整組覆蓋（先刪後寫），並預抓圖片到本地快取。
     */
    public static void save(Context ctx, JSONObject uiSet) {
        if (ctx == null || uiSet == null) {
            return;
        }

        SettingsDao dao = new SettingsDao(ctx);
        try {
            dao.deleteWhere(SETTING_ID);

            Iterator<String> keys = uiSet.keys();
            while (keys.hasNext()) {
                String partKey = keys.next();
                String url = uiSet.optString(partKey, "");
                if (partKey == null || partKey.isEmpty() || url == null || url.isEmpty()) {
                    continue;
                }

                dao.insertOne(new SettingStructure(SETTING_ID, new String[]{partKey, url}));

                // 預先下載到本地檔（force=true 確保更新後重抓）；失敗不阻斷，套用時仍會退回以 URL 直載。
                try {
                    new ImageGlide(ctx).preload(url, true);
                } catch (Exception ignore) {
                }
            }
        } catch (Exception ignore) {
        } finally {
            dao.close();
        }
    }

    /**
     * 取某部位設定的圖片 URL；未設定回傳 null。
     */
    public static String getUrl(Context ctx, String partKey) {
        if (ctx == null || partKey == null || partKey.isEmpty()) {
            return null;
        }

        SettingsDao dao = new SettingsDao(ctx);
        try {
            List<SettingStructure> list = dao.getWhere(SETTING_ID);
            if (list != null) {
                for (SettingStructure s : list) {
                    if (partKey.equals(s.getData(0))) {
                        String url = s.getData(1);
                        return (url != null && !url.isEmpty()) ? url : null;
                    }
                }
            }
        } catch (Exception ignore) {
        } finally {
            dao.close();
        }
        return null;
    }

    /**
     * 把某部位的後台設定圖套到指定 ImageView；未設定則不動（保留 XML 預設圖）。
     */
    public static void apply(String partKey, ImageView imageView) {
        if (imageView == null) {
            return;
        }

        String url = getUrl(imageView.getContext(), partKey);
        if (url == null) {
            return;
        }

        // 要套後台圖時清掉 XML 的 tint（如浮動鈕 icon 有 app:tint 會把圖整片染色）；
        // 無 tint 的部位設 null 為 no-op，不受影響。
        try {
            imageView.setImageTintList(null);
        } catch (Exception ignore) {
        }

        try {
            new ImageGlide(imageView.getContext()).fileload(url, imageView);
        } catch (Exception ignore) {
        }
    }

    /**
     * 把某部位的後台設定圖套成指定 View 的「背景」（整頁背景等）；未設定則不動、保留原背景。
     * 用 Glide 載入（有本地快取檔用檔案、否則直接以 URL 下載＝網路 fallback），能正確解 webp。
     */
    public static void applyBackground(String partKey, View view) {
        if (view == null) {
            return;
        }

        final android.content.Context ctx = view.getContext();
        if (ctx instanceof android.app.Activity) {
            android.app.Activity a = (android.app.Activity) ctx;
            if (a.isFinishing() || a.isDestroyed()) {
                return;
            }
        }

        String url = getUrl(ctx, partKey);
        if (url == null) {
            return;
        }

        try {
            Object model = url; // 預設用 URL（無本地檔時走網路）
            try {
                java.io.File f = new com.unibuy.smartdevice.tools.HttpConnect().getFileFromUrl(url);
                if (f != null && f.exists()) {
                    model = f; // 有本地快取檔優先用檔案
                }
            } catch (Exception ignore) {
            }

            com.bumptech.glide.Glide.with(ctx)
                    .load(model)
                    .into(new com.bumptech.glide.request.target.CustomTarget<android.graphics.drawable.Drawable>() {
                        @Override
                        public void onResourceReady(android.graphics.drawable.Drawable resource,
                                                    com.bumptech.glide.request.transition.Transition<? super android.graphics.drawable.Drawable> transition) {
                            view.setBackground(resource);
                        }

                        @Override
                        public void onLoadCleared(android.graphics.drawable.Drawable placeholder) {
                        }
                    });
        } catch (Exception ignore) {
        }
    }

    /**
     * 把某部位的後台色值套成指定 View 的「背景色」（C 系列底色）；未設定則不動。
     */
    public static void applyBgColor(String partKey, View view) {
        if (view == null) {
            return;
        }
        Integer color = getColor(view.getContext(), partKey);
        if (color != null) {
            view.setBackgroundColor(color);
        }
    }

    /**
     * 把某部位的後台色值套成指定 TextView 的「文字色」（T 系列文字色）；未設定則不動。
     */
    public static void applyTextColor(String partKey, TextView textView) {
        if (textView == null) {
            return;
        }
        Integer color = getColor(textView.getContext(), partKey);
        if (color != null) {
            textView.setTextColor(color);
        }
    }

    /**
     * 取某部位設定的色值（#RRGGBB / #AARRGGBB）並解析成 int；未設定或非色值回 null。
     */
    private static Integer getColor(Context ctx, String partKey) {
        String val = getUrl(ctx, partKey);
        if (val == null || !val.startsWith("#")) {
            return null;
        }
        try {
            return Color.parseColor(val);
        } catch (Exception e) {
            return null;
        }
    }
}
