package com.vpnpanel.api;

import android.content.Context;
import android.content.Intent;
import com.vpnpanel.LoginActivity;
import com.vpnpanel.security.EncryptedStorage;
import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;
import retrofit2.Call;

import java.io.IOException;

/**
 * Interceptor برای اضافه کردن Token به تمام درخواست‌ها
 * و مدیریت خودکار Refresh Token
 */
public class AuthInterceptor implements Interceptor {

    private Context context;

    public AuthInterceptor(Context context) {
        this.context = context.getApplicationContext();
    }

    @Override
    public Response intercept(Chain chain) throws IOException {
        Request originalRequest = chain.request();

        // دریافت Token از ذخیره امن
        String token = EncryptedStorage.getInstance(context).getToken();

        if (token == null) {
            // Token وجود ندارد، درخواست را بدون Authorization ارسال کن
            return chain.proceed(originalRequest);
        }

        // اضافه کردن Token به Header
        Request authenticatedRequest = originalRequest.newBuilder()
            .header("Authorization", "Bearer " + token)
            .header("Accept", "application/json")
            .build();

        Response response = chain.proceed(authenticatedRequest);

        // اگر 401 دریافت شد، Token منقضی شده
        if (response.code() == 401) {
            response.close();

            // تلاش برای Refresh Token
            if (refreshToken()) {
                // Token جدید دریافت شد، درخواست را دوباره ارسال کن
                token = EncryptedStorage.getInstance(context).getToken();
                Request newRequest = originalRequest.newBuilder()
                    .header("Authorization", "Bearer " + token)
                    .header("Accept", "application/json")
                    .build();
                return chain.proceed(newRequest);
            } else {
                // Refresh Token هم منقضی شده، به صفحه Login برگرد
                redirectToLogin();
            }
        }

        return response;
    }

    /**
     * تلاش برای Refresh Token
     */
    private boolean refreshToken() {
        try {
            String refreshToken = EncryptedStorage.getInstance(context).getRefreshToken();
            if (refreshToken == null) {
                return false;
            }

            // فراخوانی API برای Refresh Token
            ApiService apiService = ApiClient.getClient(context).create(ApiService.class);
            Call<LoginResponse> call = apiService.refreshToken(new RefreshTokenRequest(refreshToken));
            retrofit2.Response<LoginResponse> response = call.execute();

            if (response.isSuccessful() && response.body() != null) {
                String newToken = response.body().getToken();
                String newRefreshToken = response.body().getRefreshToken();

                // ذخیره Token‌های جدید
                EncryptedStorage storage = EncryptedStorage.getInstance(context);
                storage.saveToken(newToken);
                storage.saveRefreshToken(newRefreshToken);

                return true;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return false;
    }

    /**
     * انتقال به صفحه Login
     */
    private void redirectToLogin() {
        // پاک کردن تمام داده‌ها
        EncryptedStorage.getInstance(context).clearAll();

        // انتقال به Login
        Intent intent = new Intent(context, LoginActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        context.startActivity(intent);
    }
}
