import axios from 'axios';
import { getStore } from '../app/store';
import { logout } from '../features/auth/authSlice';
import { refreshAccessToken } from './authApi';

// REGEX ตรวจจับตัวเลขที่ใหญ่เกิน 15 หลัก (ซึ่งเกินขีดจำกัดความปลอดภัยของ JS)
const bigIntRegex = /"id":(\d{15,})/g;

// 1. สร้าง Axios Instance โดยใช้ Base URL จาก .env
const axiosClient = axios.create({
    baseURL: import.meta.env.VITE_API_BASE_URL,
    // กำหนด Timeout เพื่อป้องกันการค้าง
    timeout: 15000,
    transformResponse: [
        function (data) {
            if (typeof data === 'string') {
                // 1. ใช้ Regex เพื่อค้นหาฟิลด์ "id" ที่มีตัวเลขเกิน 15 หลัก
                data = data.replace(bigIntRegex, (match, p1) => {
                    // 2. แปลงตัวเลขนั้นให้เป็น String ที่มีเครื่องหมายคำพูดล้อมรอบ
                    return `"id":"${p1}"`;
                });
            }
            // 3. เรียก JSON.parse หลังจากแปลงแล้ว
            try {
                return JSON.parse(data);
            } catch {
                return data; // คืนค่าเดิมถ้าไม่สามารถ Parse JSON ได้ (เช่น 404 text)
            }
        },
    ].concat(axios.defaults.transformResponse || []),
});


// 2. เพิ่ม Interceptor เพื่อแนบ Token ใน Header
axiosClient.interceptors.request.use(
    (config) => {
        // ดึง Token จาก Local Storage
        const token = localStorage.getItem('token');

        // ถ้ามี Token ให้แนบไปใน Header 'Authorization'
        if (token) {
            // รูปแบบจากเป็น 'Bearer'
            // ตามที่กำหนดใน Django DRF/Djoser settings (JWTAuthentication)
            config.headers.Authorization = `Bearer ${token}`;
        }

        return config;
    },
    (error) => {
        return Promise.reject(error);
    }
);


// 3. (Optional) Interceptor สำหรับ Response (จัดการ Token Expired)

axiosClient.interceptors.response.use(
    (response) => response,
    async (error) => {
        const status = error.response ? error.response.status : null;
        const originalRequest = error.config;

        // ถ้าเป็น 401 และ Request นั้นยังไม่ถูกลอง Refresh
        if (status === 401 && !originalRequest._retry) {

            originalRequest._retry = true; // ตั้ง Flag ว่ากำลังจะลอง Refresh

            const storeInstance = getStore();

            try {
                // 1. เรียกฟังก์ชัน Refresh Token
                const newAccessToken = await refreshAccessToken();

                // 2. บันทึก Access Token ใหม่
                localStorage.setItem('token', newAccessToken);

                // 3. อัปเดต Header ของ Request เดิม
                originalRequest.headers.Authorization = `Bearer ${newAccessToken}`;

                // 4. ลองเรียก Request เดิมซ้ำอีกครั้ง
                return axiosClient(originalRequest);

            } catch (refreshError) {
                // หาก Refresh Token ล้มเหลว (หมดอายุ 30 วันแล้ว)
                console.error("JWT Refresh Failed. Logging out.", refreshError);
                storeInstance.dispatch(logout()); // บังคับ Logout
                return Promise.reject(error);
            }
        }

        // ถ้าได้รับ 401 หรือ 403 (Token หมดอายุ/ไม่มีสิทธิ์)
        if (status === 401 || status === 403) {
            // Logic สำหรับการจัดการ Token หมดอายุ (เช่น Redirect ไปหน้า Login)
            console.error("Authorization Failed: Token expired or insufficient roles.");

            // บังคับ Logout
            const storeInstance = getStore(); // เรียกใช้ store instance
            if (storeInstance) {
                storeInstance.dispatch(logout()); // เรียก Redux Action
            }
        }
        return Promise.reject(error);
    }
);


export default axiosClient;