package com.ttstd.controller.network;

import android.util.Log;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.ttstd.controller.utils.TokenStore;

import java.io.IOException;

import okhttp3.Interceptor;
import okhttp3.Response;

/**
 * 统一 401 拦截器。
 *
 * <p>任意 REST 接口返回 401（未授权 / 令牌失效）时，清理本地令牌并通过注册的
 * {@link OnUnauthorizedListener} 通知 UI 回到登录页。这样 {@code /bindings}、
 * {@code /devices/online-guests} 等普通业务接口的 401 也能与 WebSocket 4001/4003 走一致的
 * 「回登录页」逻辑，无需在每个 ViewModel 回调里重复判断。
 *
 * <p>因 OkHttp 为全局单例，可能在没有 Activity 监听时收到 401，故用静态 {@code handler}：
 * 由 {@code MainActivity} 在 {@code onCreate} 注册、{@code onDestroy} 注销。未注册时仅清令牌。
 */
public class UnauthorizedInterceptor implements Interceptor {

    /** 401 回调：通常触发「清理 UI 状态 + 跳登录页」。 */
    public interface OnUnauthorizedListener {
        void onUnauthorized(String message);
    }

    @Nullable
    private static volatile OnUnauthorizedListener handler;

    /** 由前台 Activity 注册；传 null 注销。 */
    public static void setHandler(@Nullable OnUnauthorizedListener listener) {
        handler = listener;
    }

    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;
                TokenStore.get().clear();
                OnUnauthorizedListener current = handler;
                if (current != null) {
                    current.onUnauthorized("登录已失效，请重新登录");
                }
                notified = false;
            }
        }
        return response;
    }
}
