import axios from 'axios';

const api = axios.create({
    baseURL: import.meta.env.VITE_SSO_HOST,
    headers: { 'Content-Type': 'application/json' },
});

const cleanApi = axios.create({
    baseURL: import.meta.env.VITE_SSO_HOST,
    headers: { "Content-Type": "application/json" },
});

// Attach token automatically
api.interceptors.request.use((config) => {
    const token = localStorage.getItem('access_token');
    if (token) config.headers.Authorization = `Bearer ${token}`;
    return config;
});

// Function to check token validity and refresh if expired
export async function ensureToken(): Promise<string | null> {
    const accessToken = localStorage.getItem('access_token');
    const refreshToken = localStorage.getItem('refresh_token');
    console.log(accessToken)
    console.log(refreshToken)
    if (!accessToken || !refreshToken) return null;

    try {
        // Check token
        await cleanApi.post(
            "/api/check_token",
            { headers: { Authorization: `Bearer ${accessToken}` } }
        );
        // await api.post('api/refresh_token', { refresh_token: refreshToken });
        // console.log("REFRESH TOKEN SENT:", refreshToken);
        return accessToken; // Token is valid
    } catch {
        // Token expired → refresh
        console.warn("Access token expired — trying refresh...");

        try {
            // Try refresh
            const { data } = await cleanApi.post("api/refresh_token", {
                refresh_token: refreshToken,
            });

            // Store new tokens
            localStorage.setItem("access_token", data.access_token);
            localStorage.setItem("refresh_token", data.refresh_token);

            // Sync to Laravel session
            await axios.post(`${import.meta.env.VITE_APP_URL}/sync-token`, {
                access_token: data.access_token,
                refresh_token: data.refresh_token,
            });

            return data.access_token;
        } catch (refreshError) {
            console.error("Refresh failed:", refreshError);

            // Clear ONLY tokens
            localStorage.removeItem("access_token");
            localStorage.removeItem("refresh_token");

            // Redirect user to home page (login)
            window.location.href = "/";

            return null;
        }
    }
}

// Optional: automatic retry on 401
api.interceptors.response.use(
    (res) => res,
    async (error) => {
        const originalRequest = error.config;
        if (error.response?.status === 401 && !originalRequest._retry) {
            originalRequest._retry = true;
            const newToken = await ensureToken();
            if (newToken) {
                originalRequest.headers.Authorization = `Bearer ${newToken}`;
                return api(originalRequest);
            }
        }
        return Promise.reject(error);
    }
);

export default api;
