// 🆕 Audit Report Approvals API — /audit-report-approvals base.
import { fetchApi } from "@/lib/api/http";

export const AUDIT_REPORT_API_BASE_URL =
  process.env.NEXT_PUBLIC_API_URL ?? "http://localhost:3008/api";

export type ReportScheme = "QRS" | "TQS";
export type ReportApprovedFilter = "all" | "approved" | "pending";

export interface AuditReportRow {
  id: number;
  audit_code: string;
  audit_type: string | null;
  audit_stage: string | null;
  status: string | null;
  stg1_audit_report: string | null;
  stg2_audit_report: string | null;
  attendance_doc: string | null;
  support_docs: string | null;
  audit_date: string | null;
  auditor_name: string;
  report_qaqc_approved: boolean | 0 | 1;
  report_qaqc_rejected_reason: string | null;
  company_id: number;
  company_name: string;
  scheme: ReportScheme | null;
}

export interface AuditReportQueueResponse {
  data: AuditReportRow[];
  total: number;
  page: number;
  lastPage: number;
  scope: ReportScheme | null;
  seesAll: boolean;
}

export interface AuditReportQueueParams {
  page?: number;
  limit?: number | string;
  search?: string;
  approved?: ReportApprovedFilter;
  auditorId?: number | string;
  auditType?: string;
  status?: string;       // s1_uploaded | s1_missing | s2_uploaded | s2_missing
  year?: number | string;
  month?: number | string;
  from?: string;
  to?: string;
}

export async function getAuditReportQueue(
  params: AuditReportQueueParams = {},
): Promise<AuditReportQueueResponse> {
  const q = new URLSearchParams();
  q.set("page", String(params.page ?? 1));
  if (params.limit) q.set("limit", String(params.limit));
  if (params.search) q.set("search", params.search);
  q.set("approved", params.approved ?? "all");
  if (params.auditorId) q.set("auditorId", String(params.auditorId));
  if (params.auditType) q.set("auditType", params.auditType);
  if (params.status) q.set("status", params.status);
  if (params.year) q.set("year", String(params.year));
  if (params.month) q.set("month", String(params.month));
  if (params.from) q.set("from", params.from);
  if (params.to) q.set("to", params.to);
  return fetchApi<AuditReportQueueResponse>(
    `${AUDIT_REPORT_API_BASE_URL}/audit-report-approvals/queue?${q.toString()}`,
  );
}

export async function approveAuditReport(id: number) {
  return fetchApi(`${AUDIT_REPORT_API_BASE_URL}/audit-report-approvals/${id}/approve`, { method: "POST" });
}

export async function rejectAuditReport(id: number, reason?: string) {
  return fetchApi(`${AUDIT_REPORT_API_BASE_URL}/audit-report-approvals/${id}/reject`, {
    method: "POST",
    body: JSON.stringify({ reason: reason ?? "" }),
  });
}

// 🆕 Open a report/doc through the approvals route (scheme-scoped — bypasses
//    the my-audits auditor-assignment check that was returning 403).
function authHeaders(): HeadersInit {
  if (typeof window === "undefined") return {};
  const t =
    localStorage.getItem("access_token") ||
    sessionStorage.getItem("access_token") ||
    localStorage.getItem("token") ||
    localStorage.getItem("authToken") ||
    "";
  return t ? { Authorization: `Bearer ${t}` } : {};
}

export async function fetchApprovalReportBlob(
  rowId: number,
  docType: "stage1_report" | "stage2_report" | "attendance" | "support_docs",
): Promise<string> {
  const url = `${AUDIT_REPORT_API_BASE_URL}/audit-report-approvals/${rowId}/file/${docType}`;
  const res = await fetch(url, { headers: authHeaders() });
  if (!res.ok) {
    let detail = "";
    try { detail = (await res.json())?.message || ""; } catch {}
    throw new Error(`Failed to open file: ${res.status} ${res.statusText}${detail ? ` — ${detail}` : ""}`);
  }
  const blob = await res.blob();
  return URL.createObjectURL(blob);
}