import { getHttpClient } from './http';

export interface CrmNotification {
  id: number;
  action: string;
  title: string;
  body: string;
  seen: boolean;
  createdAt: string | null;
  module?: string | null;
  screen?: string | null;
  targetId?: number | null;
  propertyId: number | null;
  demandeId: number | null;
  clientId: number | null;
  reservationId?: number | null;
  visitId?: number | null;
  eventId?: number | null;
}

let unread = 0;
const listeners = new Set<(n: number) => void>();

export function getUnreadCount(): number {
  return unread;
}

export function setUnreadCount(n: number): void {
  unread = Math.max(0, n);
  listeners.forEach((l) => l(unread));
}

export function subscribeUnread(listener: (n: number) => void): () => void {
  listeners.add(listener);
  listener(unread);
  return () => listeners.delete(listener);
}

export async function fetchNotifications(page = 1): Promise<{
  items: CrmNotification[];
  total: number;
  page: number;
  unread: number;
}> {
  const { client } = await getHttpClient();
  const { data } = await client.get('/mobile/notifications', { params: { page } });
  const unreadCount = Number(data?.unread ?? 0);
  setUnreadCount(unreadCount);
  return {
    items: Array.isArray(data?.items) ? data.items : [],
    total: Number(data?.total ?? 0),
    page: Number(data?.page ?? page),
    unread: unreadCount,
  };
}

export async function fetchUnreadCount(): Promise<number> {
  const { client } = await getHttpClient();
  const { data } = await client.get('/mobile/notifications/unread-count');
  const n = Number(data?.unread ?? 0);
  setUnreadCount(n);
  return n;
}

export async function setNotificationSeen(id: number, seen: boolean): Promise<number> {
  const { client } = await getHttpClient();
  const { data } = await client.post(`/mobile/notifications/${id}/seen`, { seen });
  const n = Number(data?.unread ?? 0);
  setUnreadCount(n);
  return n;
}

export async function markAllNotificationsSeen(): Promise<number> {
  const { client } = await getHttpClient();
  const { data } = await client.post('/mobile/notifications/seen-all');
  const n = Number(data?.unread ?? 0);
  setUnreadCount(n);
  return n;
}
