"use client";
import { useCallback, useEffect, useState } from "react";
import {
  getAuditReportQueue,
  approveAuditReport,
  rejectAuditReport,
} from "@/lib/api/auditReportApproval.api";
import type {
  AuditReportRow,
  ReportScheme,
  AuditReportQueueParams,
} from "@/lib/api/auditReportApproval.api";

export type AuditReportFilters = Omit<AuditReportQueueParams, "page" | "limit">;

export function useAuditReportApprovals(initialPage = 1) {
  const [rows, setRows] = useState<AuditReportRow[]>([]);
  const [page, setPage] = useState(initialPage);
  const [itemsPerPage, setItemsPerPage] = useState(10);
  const [lastPage, setLastPage] = useState(1);
  const [total, setTotal] = useState(0);
  const [scope, setScope] = useState<ReportScheme | null>(null);
  const [seesAll, setSeesAll] = useState(false);
  const [filters, setFilters] = useState<AuditReportFilters>({ approved: "all" });
  const [loading, setLoading] = useState(false);
  const [error, setError] = useState<string | null>(null);
  const [actioningId, setActioningId] = useState<number | null>(null);

  const refresh = useCallback(() => {
    setLoading(true);
    setError(null);
    getAuditReportQueue({ ...filters, page, limit: itemsPerPage })
      .then((res) => {
        setRows(res.data);
        setTotal(res.total);
        setLastPage(res.lastPage);
        setScope(res.scope);
        setSeesAll(res.seesAll);
      })
      .catch((e: any) => setError(e.message ?? "Failed to load approvals"))
      .finally(() => setLoading(false));
  }, [filters, page, itemsPerPage]);

  useEffect(() => { refresh(); }, [refresh]);

  const setFilter = (patch: Partial<AuditReportFilters>) => {
    setPage(1);
    setFilters((prev) => ({ ...prev, ...patch }));
  };
  const clearFilters = () => { setPage(1); setFilters({ approved: "all" }); };

  const approve = async (id: number) => {
    setActioningId(id); setError(null);
    try { await approveAuditReport(id); refresh(); return true; }
    catch (e: any) { setError(e.message ?? "Approve failed"); return false; }
    finally { setActioningId(null); }
  };
  const reject = async (id: number, reason?: string) => {
    setActioningId(id); setError(null);
    try { await rejectAuditReport(id, reason); refresh(); return true; }
    catch (e: any) { setError(e.message ?? "Reject failed"); return false; }
    finally { setActioningId(null); }
  };

  return {
    rows, page, setPage, itemsPerPage, setItemsPerPage, lastPage, total, scope, seesAll,
    filters, setFilter, clearFilters,
    loading, error, actioningId, refresh, approve, reject,
  };
}