package com.tongyi.multimodal_dialog;

import android.content.Context;
import android.content.SharedPreferences;
import android.text.TextUtils;
import android.util.Log;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.nio.charset.StandardCharsets;
import java.util.Properties;

/**
 * 凭证读写工具
 *
 * 三级回退读取（从高到低）：
 *   1. SharedPreferences ：用户上次在启动页输入并点击启动后保存的值
 *   2. assets/credentials.properties ：开发者本地配置（已加 .gitignore，不进仓库）
 *   3. 占位符（YOUR_xxx）：提示用户去填
 */
public final class BailianCredentials {

    private static final String TAG = "BailianCredentials";

    /** SharedPreferences 名称 */
    private static final String PREFS_NAME = "bailian_credentials";
    /** assets 中的本地凭证文件名（不进仓库） */
    private static final String ASSETS_FILE = "credentials.properties";
    /** 占位符前缀，识别"用户还没填"的字段 */
    private static final String PLACEHOLDER_PREFIX = "YOUR_";

    public static final String KEY_API_KEY = "apiKey";
    public static final String KEY_WORKSPACE_ID = "workspaceId";
    public static final String KEY_APP_ID = "appId";
    public static final String KEY_URL = "url";

    private BailianCredentials() {}

    /**
     * 读取一个凭证字段，按 SP → assets → defaultValue 的顺序回退。
     */
    public static String load(Context context, String key, String defaultValue) {
        // 1. SharedPreferences（用户上次输入）
        String fromPrefs = prefs(context).getString(key, null);
        if (isUsable(fromPrefs)) return fromPrefs;

        // 2. assets/credentials.properties（开发者本地）
        String fromAssets = loadFromAssets(context, key);
        if (isUsable(fromAssets)) return fromAssets;

        // 3. 默认值（一般是占位符或空字符串）
        return defaultValue;
    }

    /**
     * 把用户在启动页填的凭证持久化到 SharedPreferences，下次开 App 自动回填。
     * 占位符值不会写入，避免污染存储。
     */
    public static void save(Context context, String apiKey, String workspaceId, String appId) {
        SharedPreferences.Editor editor = prefs(context).edit();
        if (isUsable(apiKey)) editor.putString(KEY_API_KEY, apiKey);
        if (isUsable(workspaceId)) editor.putString(KEY_WORKSPACE_ID, workspaceId);
        if (isUsable(appId)) editor.putString(KEY_APP_ID, appId);
        editor.apply();
    }

    /**
     * 判断一个值是否"用户已填"——非空且不是 YOUR_xxx 占位符。
     */
    public static boolean isUsable(String value) {
        return !TextUtils.isEmpty(value) && !value.startsWith(PLACEHOLDER_PREFIX);
    }

    /**
     * 校验三个必填凭证是否齐全，返回第一个未填项的名字（用于 UI 提示）；全部 OK 返回 null。
     */
    public static String findMissingField(String apiKey, String workspaceId, String appId) {
        if (!isUsable(apiKey)) return "API Key";
        if (!isUsable(workspaceId)) return "Workspace ID";
        if (!isUsable(appId)) return "App ID";
        return null;
    }

    private static SharedPreferences prefs(Context context) {
        return context.getApplicationContext().getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
    }

    private static String loadFromAssets(Context context, String key) {
        // 用 UTF-8 Reader 读取，绕开 Properties 默认 ISO-8859-1 的限制——
        // 这样即便用户在 properties 文件里写了中文 value 也不会乱码。
        try (InputStream is = context.getApplicationContext().getAssets().open(ASSETS_FILE);
             Reader reader = new InputStreamReader(is, StandardCharsets.UTF_8)) {
            Properties props = new Properties();
            props.load(reader);
            return props.getProperty(key);
        } catch (IOException e) {
            // 文件不存在（开发者还没创建本地配置）属于正常情况，不打 error
            Log.d(TAG, "no local " + ASSETS_FILE + " found, fallback to default");
            return null;
        }
    }
}
