"use client";

import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";

import type { ProgressReportRow } from "../progress-report-data";
import {
  getPswgProgressReport,
  getPswgProgressReports,
  reviewPswgProgressReport,
} from "../service/progress-report-service";

export const pswgProgressReportQueryKeys = {
  all: ["pswg-progress-reports"] as const,
  list: () => [...pswgProgressReportQueryKeys.all, "list"] as const,
  detail: (assignmentId: number) =>
    [...pswgProgressReportQueryKeys.all, "detail", assignmentId] as const,
};

const EMPTY_ROWS: ProgressReportRow[] = [];

export function usePswgProgressReports() {
  const query = useQuery({
    queryKey: pswgProgressReportQueryKeys.list(),
    queryFn: getPswgProgressReports,
  });

  return {
    rows: query.data ?? EMPTY_ROWS,
    isLoading: query.isLoading,
    error:
      query.error instanceof Error
        ? query.error.message
        : query.error
          ? "Unable to load progress reports."
          : null,
  };
}

export function useReviewPswgProgressReport(assignmentId: number) {
  const queryClient = useQueryClient();

  return useMutation({
    mutationFn: () => reviewPswgProgressReport(assignmentId),
    onSuccess: async () => {
      await queryClient.invalidateQueries({
        queryKey: pswgProgressReportQueryKeys.all,
      });
    },
  });
}

export function usePswgProgressReport(id: string) {
  const assignmentId = Number(id);
  const isValidId = Number.isInteger(assignmentId) && assignmentId > 0;
  const query = useQuery({
    queryKey: pswgProgressReportQueryKeys.detail(assignmentId),
    queryFn: () => getPswgProgressReport(assignmentId),
    enabled: isValidId,
  });

  return {
    assignment: query.data ?? null,
    isValidId,
    isLoading: isValidId && query.isLoading,
    error:
      query.error instanceof Error
        ? query.error.message
        : query.error
          ? "Unable to load the progress report."
          : null,
  };
}
