"use client";

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

import {
  createCdcIssue,
  getCdcIssueMatrixDetail,
  getCdcIssueMatrixFormOptions,
  updateCdcIssue,
  type CdcIssueMatrixFormAgency,
  type CreateCdcIssuePayload,
  type UpdateCdcIssuePayload,
} from "../service/cdc-issue-matrix-service";

const cdcIssueFormQueryKey = ["cdc-issue-matrix", "issue-form-options"];
const EMPTY_AGENCIES: CdcIssueMatrixFormAgency[] = [];
const cdcIssueDetailQueryKey = (issueId: number) => [
  "cdc-issue-matrix",
  "issue-detail",
  issueId,
];

/**
 * The ministry list for the table's inline picker. It shares the query key with
 * the issue dialog, so both read the same cached lookup.
 */
export function useCdcIssueMatrixFormOptions(enabled: boolean) {
  const query = useQuery({
    queryKey: cdcIssueFormQueryKey,
    queryFn: getCdcIssueMatrixFormOptions,
    enabled,
    staleTime: 5 * 60 * 1000,
  });

  return {
    agencies: query.data?.agencies ?? EMPTY_AGENCIES,
  };
}

export function useCdcIssueForm(open: boolean, issueId?: number) {
  const queryClient = useQueryClient();
  const optionsQuery = useQuery({
    queryKey: cdcIssueFormQueryKey,
    queryFn: getCdcIssueMatrixFormOptions,
    enabled: open,
    staleTime: 5 * 60 * 1000,
  });

  const detailQuery = useQuery({
    queryKey: cdcIssueDetailQueryKey(issueId ?? 0),
    queryFn: () => getCdcIssueMatrixDetail(issueId ?? 0),
    enabled: open && issueId !== undefined,
  });

  const createMutation = useMutation({
    mutationFn: (payload: CreateCdcIssuePayload) => createCdcIssue(payload),
    onSuccess: () => {
      void queryClient.invalidateQueries({
        queryKey: ["cdc-issue-matrix"],
      });
    },
  });

  const updateMutation = useMutation({
    mutationFn: ({
      issueId: targetIssueId,
      payload,
    }: {
      issueId: number;
      payload: UpdateCdcIssuePayload;
    }) => updateCdcIssue(targetIssueId, payload),
    onSuccess: (_message, variables) => {
      void queryClient.invalidateQueries({
        queryKey: ["cdc-issue-matrix"],
      });
      void queryClient.invalidateQueries({
        queryKey: cdcIssueDetailQueryKey(variables.issueId),
      });
    },
  });

  return {
    agencies: optionsQuery.data?.agencies ?? [],
    detail: detailQuery.data ?? null,
    error:
      optionsQuery.error instanceof Error
        ? optionsQuery.error.message
        : detailQuery.error instanceof Error
          ? detailQuery.error.message
        : createMutation.error instanceof Error
            ? createMutation.error.message
            : updateMutation.error instanceof Error
              ? updateMutation.error.message
              : null,
    isLoading: optionsQuery.isLoading || detailQuery.isLoading,
    isSaving: createMutation.isPending || updateMutation.isPending,
    draftIssueStatusId: optionsQuery.data?.draftIssueStatusId ?? 0,
    issueStatusId: optionsQuery.data?.issueStatusId ?? 0,
    save: createMutation.mutateAsync,
    update: updateMutation.mutateAsync,
    workingGroups: optionsQuery.data?.workingGroups ?? [],
  };
}
