import httpClient from '@/api/httpClient';
import { registerForPushNotificationsAsync } from '@/components/NotificationProvider';
import { useQueryClient } from '@tanstack/react-query';
import * as Notifications from 'expo-notifications';
import { router } from 'expo-router';
import { useEffect, useRef } from 'react';
import { Platform } from 'react-native';
import { getToken } from './storage.native';

export interface IRegisterDeviceBody {
  token: string;
  platform: string;
}

export const commonRequests = {
  /**
   * Register device for notification
   * @param body token
   * @returns
   */
  async registerDevice(body: IRegisterDeviceBody) {
    const response = await httpClient.post('https://api.infotarget.uz/api/push-token/', body, {
      headers: {
        Authorization: `Bearer ${getToken()}`,
      },
    });
    return response;
  },
};
export function useNotifications() {
  const notificationListener = useRef<any>(null);
  const responseListener = useRef<any>(null);
  const queryClient = useQueryClient();

  useEffect(() => {
    // Android channel
    if (Platform.OS === 'android') {
      Notifications.setNotificationChannelAsync('default', {
        name: 'default',
        importance: Notifications.AndroidImportance.MAX,
        vibrationPattern: [0, 250, 250, 250],
        lightColor: '#FF231F7C',
      });
    }

    // Foreground listener
    notificationListener.current = Notifications.addNotificationReceivedListener((notification) => {
      console.log('Notification received:', notification);
    });

    // User response listener
    responseListener.current = Notifications.addNotificationResponseReceivedListener((response) => {
      const data = response.notification.request.content.data;
      queryClient.refetchQueries({ queryKey: ['notification-list'] });
      queryClient.refetchQueries({ queryKey: ['notifications-list'] });
      router.push('/profile/notification');
    });

    // Token olish va serverga yuborish
    registerForPushNotificationsAsync().then((token) => {
      if (!token) return;
      commonRequests.registerDevice({ token, platform: Platform.OS });
    });

    return () => {
      notificationListener.current?.remove();
      responseListener.current?.remove();
    };
  }, []);
}
