'use client';

/**
 * React Query hooks for admin monitor checks.
 */

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

export type CheckSeverity = 'info' | 'warn' | 'page';

export interface CheckView {
  key: string;
  title: string;
  defaultConfig: Record<string, unknown>;
  defaultIntervalHours: number;
  enabled: boolean;
  config: Record<string, unknown>;
  severityFloor: CheckSeverity | null;
  intervalHours: number | null;
  includeInDigest: boolean;
  lastRunAt: string | null;
  lastSeverity: CheckSeverity | null;
  lastDetail: string | null;
}

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 useChecks() {
  return useQuery({
    queryKey: keys.checks(),
    queryFn: async () => {
      const data = await fetch('/api/admin/monitor/checks').then(jsonOrThrow);
      return (data.checks as CheckView[]) ?? [];
    },
  });
}

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