package com.ttstd.controlled.utils;

import android.content.Context;
import android.content.SharedPreferences;

import java.security.SecureRandom;

/**
 * 被控端安全验证配置：动态验证码与固定密码。
 * 密钥仅保存在被控端本机，服务器只做转发，不接触任何密钥。
 */
public class AuthSettings {

    private static final String PREF_NAME = "controlled_auth_prefs";
    private static final String KEY_DYNAMIC_CODE = "dynamic_code";
    private static final String KEY_FIXED_PASSWORD = "fixed_password";
    /** 是否允许“免密连接”（被控端手动确认）。默认开启。 */
    private static final String KEY_ALLOW_NO_AUTH = "allow_no_auth";

    private static final String CODE_CHARS =
            "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
    private static final int CODE_LENGTH = 6;
    private static final SecureRandom RANDOM = new SecureRandom();

    /** 生成一个 6 位、由大小写字母与数字组成的随机验证码。 */
    public static String generateDynamicCode() {
        StringBuilder sb = new StringBuilder(CODE_LENGTH);
        for (int i = 0; i < CODE_LENGTH; i++) {
            sb.append(CODE_CHARS.charAt(RANDOM.nextInt(CODE_CHARS.length())));
        }
        return sb.toString();
    }

    /**
     * 获取当前动态验证码；若不存在则随机生成并持久化。
     */
    public static String getDynamicCode(Context context) {
        SharedPreferences sp = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
        String code = sp.getString(KEY_DYNAMIC_CODE, null);
        if (code == null || code.isEmpty()) {
            code = generateDynamicCode();
            sp.edit().putString(KEY_DYNAMIC_CODE, code).apply();
        }
        return code;
    }

    public static void setDynamicCode(Context context, String code) {
        context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE)
                .edit().putString(KEY_DYNAMIC_CODE, code == null ? "" : code).apply();
    }

    /** 获取固定密码（未设置时为空字符串）。 */
    public static String getFixedPassword(Context context) {
        return context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE)
                .getString(KEY_FIXED_PASSWORD, "");
    }

    public static void setFixedPassword(Context context, String password) {
        context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE)
                .edit().putString(KEY_FIXED_PASSWORD, password == null ? "" : password).apply();
    }

    /** 是否允许免密连接（被控端手动确认）。默认开启。 */
    public static boolean isNoAuthAllowed(Context context) {
        return context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE)
                .getBoolean(KEY_ALLOW_NO_AUTH, true);
    }

    /** 设置是否允许免密连接。 */
    public static void setNoAuthAllowed(Context context, boolean allowed) {
        context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE)
                .edit().putBoolean(KEY_ALLOW_NO_AUTH, allowed).apply();
    }
}
