import axios from 'axios';
import { parseCookies, setCookie, destroyCookie } from 'nookies';

const API_BASE_URL = process.env.NEXT_PUBLIC_API_URL || 'https://readygo.api.clonifynow.com';

const timezone = typeof Intl !== 'undefined' ? Intl.DateTimeFormat().resolvedOptions().timeZone : 'Asia/Calcutta';

export const apiClient = axios.create({
  baseURL: API_BASE_URL,
  headers: {
    'Content-Type': 'application/json',
    'Cache-Control': 'no-store, no-cache, must-revalidate, max-age=0',
    Pragma: 'no-cache',
    'ngrok-skip-browser-warning': 'true',
    timezone,
  },
});

apiClient.interceptors.request.use((config) => {
  const cookies = parseCookies();
  const token =
    cookies['cookies_user_access_token'] ||
    cookies['cookies_user_access_token_temp'] ||
    cookies['COOKIES_USER_ACCESS_TOKEN'] ||
    (typeof window !== 'undefined' ? sessionStorage.getItem('token') : null);

  if (token && config.headers) {
    config.headers.Authorization = `Bearer ${token}`;
  }
  return config;
});

export const authApi = {
  async continueWithPhone(payload: { phone: string; country_code?: string; type?: string }) {
    const cleanCountryCode = (payload.country_code || '91').replace(/^\+/, '');
    const cleanPhone = payload.phone.trim().replace(/\D/g, '');

    const response = await apiClient.post('/auth/continue-with-phone', {
      phone: cleanPhone,
      country_code: cleanCountryCode,
      type: payload.type || 'customer',
    });

    const data = response.data;
    if (data?.token) {
      destroyCookie(null, 'cookies_user_access_token', { path: '/' });
      setCookie(null, 'cookies_user_access_token_temp', data.token, {
        maxAge: 30 * 24 * 60 * 60,
        path: '/',
      });
      if (typeof window !== 'undefined') {
        sessionStorage.setItem('token', data.token);
      }
    }
    return data;
  },

  async verifyPhone(payload: { otp: string; device_type?: string; fcm_token?: string; token?: string }) {
    const cookies = parseCookies();
    const bearerToken = payload.token || cookies['cookies_user_access_token_temp'] || (typeof window !== 'undefined' ? sessionStorage.getItem('token') : null);

    const headers: Record<string, string> = {};
    if (bearerToken) {
      headers['Authorization'] = `Bearer ${bearerToken}`;
    }

    const response = await apiClient.post(
      '/auth/verify-phone',
      {
        otp: payload.otp.trim(),
        device_type: payload.device_type || 'web',
        fcm_token: payload.fcm_token || '',
      },
      { headers }
    );

    const data = response.data;
    const finalToken = data?.access_token || data?.token || data?.data?.access_token;

    if (finalToken) {
      destroyCookie(null, 'cookies_user_access_token_temp', { path: '/' });
      setCookie(null, 'cookies_user_access_token', finalToken, {
        maxAge: 30 * 24 * 60 * 60,
        path: '/',
      });
      setCookie(null, 'COOKIES_USER_ACCESS_TOKEN', finalToken, {
        maxAge: 30 * 24 * 60 * 60,
        path: '/',
      });
      if (typeof window !== 'undefined') {
        sessionStorage.setItem('token', finalToken);
        localStorage.setItem('auth_token', finalToken);
      }
    }
    return data;
  },

  async editProfile(payload: { name: string; email: string; gender?: string; applied_referral_code?: string }) {
    const response = await apiClient.put('/auth/edit-profile', payload);
    return response.data;
  },

  async verifyEmail(payload: { otp: string; email?: string }) {
    const response = await apiClient.put('/auth/verify-email', payload);
    const cookies = parseCookies();
    const tempToken = cookies['cookies_user_access_token_temp'] || (typeof window !== 'undefined' ? sessionStorage.getItem('token') : null);
    const finalToken = response.data?.access_token || response.data?.token || tempToken;

    if (finalToken) {
      destroyCookie(null, 'cookies_user_access_token_temp', { path: '/' });
      setCookie(null, 'cookies_user_access_token', finalToken, {
        maxAge: 30 * 24 * 60 * 60,
        path: '/',
      });
      setCookie(null, 'COOKIES_USER_ACCESS_TOKEN', finalToken, {
        maxAge: 30 * 24 * 60 * 60,
        path: '/',
      });
      if (typeof window !== 'undefined') {
        sessionStorage.setItem('token', finalToken);
        localStorage.setItem('auth_token', finalToken);
      }
    }
    return response.data;
  },

  async getProfile() {
    const response = await apiClient.get('/auth/get-profile');
    return response.data;
  },

  async logout() {
    try {
      await apiClient.delete('/auth/logout');
    } catch (e) {
      console.warn('Backend logout:', e);
    } finally {
      destroyCookie(null, 'cookies_user_access_token', { path: '/' });
      destroyCookie(null, 'cookies_user_access_token_temp', { path: '/' });
      destroyCookie(null, 'COOKIES_USER_ACCESS_TOKEN', { path: '/' });
      if (typeof window !== 'undefined') {
        sessionStorage.clear();
        localStorage.clear();
      }
    }
  },
};
