"use client";

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

import {
  getIssueMatrixIssueById,
  getIssueMatrixIssues,
  getIssueMatrixSummary,
} from "@/features/pswg/issue-matrix/service/issue-matrix-service";
import type {
  IssueMatrixRow,
  IssueMatrixSummary,
} from "@/features/pswg/issue-matrix/components/issue-matrix-data";

const EMPTY_ROWS: IssueMatrixRow[] = [];
const EMPTY_SUMMARY: IssueMatrixSummary = {
  totalIssues: 0,
  solved: 0,
  inProgress: 0,
  notAddressed: 0,
  totalPrimaryAgencies: 0,
};

const issueMatrixQueryKeys = {
  all: ["issue-matrix"] as const,
  list: () => [...issueMatrixQueryKeys.all, "list"] as const,
  summary: () => [...issueMatrixQueryKeys.all, "summary"] as const,
  detail: (issueId: number) =>
    [...issueMatrixQueryKeys.all, "detail", issueId] as const,
};

function getErrorMessage(error: unknown, fallback: string) {
  return error instanceof Error ? error.message : fallback;
}

export function useIssueMatrixList() {
  const query = useQuery({
    queryKey: issueMatrixQueryKeys.list(),
    queryFn: getIssueMatrixIssues,
  });

  return {
    rows: query.data ?? EMPTY_ROWS,
    isLoading: query.isLoading,
    error: query.error
      ? getErrorMessage(query.error, "Unable to load issue matrix.")
      : null,
  };
}

export function useIssueMatrixSummary() {
  const query = useQuery({
    queryKey: issueMatrixQueryKeys.summary(),
    queryFn: getIssueMatrixSummary,
  });

  return {
    summary: query.data ?? EMPTY_SUMMARY,
    isLoading: query.isLoading,
    error: query.error
      ? getErrorMessage(query.error, "Unable to load issue matrix summary.")
      : null,
  };
}

export function useIssueMatrixDetail(issueId: number, enabled = true) {
  const query = useQuery({
    queryKey: issueMatrixQueryKeys.detail(issueId),
    queryFn: () => getIssueMatrixIssueById(issueId),
    enabled: enabled && Number.isFinite(issueId),
  });

  return {
    issue: query.data ?? null,
    isLoading: query.isLoading,
    error: query.error
      ? getErrorMessage(query.error, "Unable to load issue detail.")
      : null,
  };
}
