package com.ttstd.controlled.network;

import android.content.Context;
import android.content.Intent;
import android.util.Log;

import androidx.annotation.NonNull;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;

import com.ttstd.controlled.utils.DeviceSecretStore;

import java.io.IOException;

import okhttp3.Interceptor;
import okhttp3.Response;

/**
 * 被控端统一 401 拦截器。
 *
 * <p>被控端没有「登录页」概念，401 表示服务端下发的 accessToken 已失效。此时应清理本地
 * 激活凭据（deviceUid / deviceSecret / accessToken），并通过本地广播通知
 * {@code ScreenCaptureService} 重新走激活流程（provision / token 换取）。
 *
 * <p>注意：令牌失效可能伴随大量并发请求同时返回 401，这里用 {@code notified} 哨兵保证
 * 一次失效只清一次凭据、只发一次重激活广播。
 */
public class UnauthorizedInterceptor implements Interceptor {

    /** ScreenCaptureService 监听此本地广播以触发重新激活。 */
    public static final String ACTION_TOKEN_INVALID = "com.ttstd.controlled.action.TOKEN_INVALID";

    private static final String TAG = "UnauthorizedInterceptor";
    private static volatile boolean notified = false;

    @NonNull
    @Override
    public Response intercept(@NonNull Chain chain) throws IOException {
        Response response = chain.proceed(chain.request());
        if (response.code() == 401) {
            Log.w(TAG, "收到 401 未授权响应，清理激活凭据并触发重新激活");
            if (!notified) {
                notified = true;
                // 清理本地激活凭据，强制重新激活。
                Context appCtx = ChainContext.getAppContext();
                if (appCtx != null) {
                    new DeviceSecretStore(appCtx).clear();
                }
                if (appCtx != null) {
                    LocalBroadcastManager.getInstance(appCtx)
                            .sendBroadcast(new Intent(ACTION_TOKEN_INVALID));
                }
                notified = false;
            }
        }
        return response;
    }
}
