'use client';

/**
 * React Query hooks for admin monitor alert channels.
 */

import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
import { getCsrfToken } from '@/lib/csrf';
import { monitorQueryKeys as keys } from './monitorQueryKeys';

export type ChannelKind = 'email' | 'telegram' | 'botmaster';
export type MinSeverity = 'warn' | 'page';

export interface ChannelView {
  id: string;
  kind: ChannelKind;
  label: string;
  enabled: boolean;
  minSeverity: MinSeverity;
  config: Record<string, unknown>;
  hasSecret: boolean;
}

async function jsonOrThrow(res: Response) {
  const data = (await res.json()) as Record<string, unknown>;
  if (!res.ok || !data.ok) {
    throw new Error((data.error as string) ?? `HTTP ${res.status}`);
  }
  return data;
}

function csrfHeaders(): HeadersInit {
  return {
    'Content-Type': 'application/json',
    'x-csrf-token': getCsrfToken(),
  };
}

export function useChannels() {
  return useQuery({
    queryKey: keys.channels(),
    queryFn: async () => {
      const data = await fetch('/api/admin/monitor/channels').then(jsonOrThrow);
      return (data.channels as ChannelView[]) ?? [];
    },
  });
}

export function useCreateChannel() {
  const qc = useQueryClient();
  return useMutation({
    mutationFn: (payload: Record<string, unknown>) =>
      fetch('/api/admin/monitor/channels', {
        method: 'POST',
        headers: csrfHeaders(),
        body: JSON.stringify(payload),
      }).then(jsonOrThrow),
    onSuccess: () => void qc.invalidateQueries({ queryKey: keys.channels() }),
  });
}

export function useUpdateChannel(id: string) {
  const qc = useQueryClient();
  return useMutation({
    mutationFn: (payload: Record<string, unknown>) =>
      fetch(`/api/admin/monitor/channels/${id}`, {
        method: 'PATCH',
        headers: csrfHeaders(),
        body: JSON.stringify(payload),
      }).then(jsonOrThrow),
    onSuccess: () => void qc.invalidateQueries({ queryKey: keys.channels() }),
  });
}

export function useDeleteChannel(id: string) {
  const qc = useQueryClient();
  return useMutation({
    mutationFn: () =>
      fetch(`/api/admin/monitor/channels/${id}`, {
        method: 'DELETE',
        headers: csrfHeaders(),
      }).then(jsonOrThrow),
    onSuccess: () => void qc.invalidateQueries({ queryKey: keys.channels() }),
  });
}

export function useTestSend() {
  return useMutation({
    mutationFn: async (channelId: string) => {
      const data = await fetch('/api/admin/monitor/test-send', {
        method: 'POST',
        headers: csrfHeaders(),
        body: JSON.stringify({ channelId }),
      }).then(jsonOrThrow);
      return {
        sent: Boolean(data.sent),
        error: (data.error as string | null | undefined) ?? null,
      };
    },
  });
}
