import { fetchApi } from "@/lib/api/http";
import type {
  AuditRequest,
  AuditRequestAnalytics,
  CreateAuditRequestDto,
  UpdateAuditRequestDto,
  ScheduleAuditRequestDto,
  RejectAuditRequestDto,
  CancelAuditRequestDto,
  AuditRequestQueryParams,
  PaginatedAuditRequestsResponse,
  CreateBatchAuditRequestResult,
  CreateBatchAuditRequestPayload,
  ProceedToInquiryPayload,
  ProceedBatchToInquiryPayload,
  ProceedToInquiryResult,
  ProceedBatchToInquiryResult,
  AvailableSlotsResponse,
} from "@/lib/api/types/audit-request.types";

export const AUDIT_REQUESTS_API_BASE_URL =
  process.env.NEXT_PUBLIC_API_URL ?? "http://localhost:3007/api";

// ─── List (paginated) ──────────────────────────────────────────────────────
export async function getAuditRequestsPaginated(
  params: AuditRequestQueryParams = {},
): Promise<PaginatedAuditRequestsResponse> {
  const {
    page = 1,
    limit = 25,
    status,
    company_id,
    requested_by_id,
    date_from,
    date_to,
    search,
  } = params;

  const q = new URLSearchParams();
  q.set("page", String(page));
  q.set("limit", String(limit));
  if (status) q.set("status", status);
  if (company_id) q.set("company_id", String(company_id));
  if (requested_by_id) q.set("requested_by_id", String(requested_by_id));
  if (date_from) q.set("date_from", date_from);
  if (date_to) q.set("date_to", date_to);
  if (search) q.set("search", search);

  const raw = await fetchApi<any>(
    `${AUDIT_REQUESTS_API_BASE_URL}/audit-requests?${q.toString()}`,
  );

  // Backend returns { data, meta: { total, page, totalPages, limit } }
  // Normalize to the flat shape your codebase uses (matches audit-schedule.api.ts).
  if (raw?.meta) {
    return {
      data: raw.data ?? [],
      total: raw.meta.total ?? 0,
      page: raw.meta.page ?? page,
      lastPage: raw.meta.totalPages ?? raw.meta.lastPage ?? 1,
      limit: raw.meta.limit ?? limit,
    };
  }
  return {
    data: raw?.data ?? [],
    total: raw?.total ?? 0,
    page: raw?.page ?? page,
    lastPage: raw?.lastPage ?? raw?.totalPages ?? 1,
    limit: raw?.limit ?? limit,
  };
}

// ─── Get one ───────────────────────────────────────────────────────────────
export async function getAuditRequest(id: number): Promise<AuditRequest> {
  return fetchApi<AuditRequest>(
    `${AUDIT_REQUESTS_API_BASE_URL}/audit-requests/${id}`,
  );
}

// ─── Analytics ─────────────────────────────────────────────────────────────
export async function getAuditRequestsAnalytics(): Promise<AuditRequestAnalytics> {
  return fetchApi<AuditRequestAnalytics>(
    `${AUDIT_REQUESTS_API_BASE_URL}/audit-requests/analytics`,
  );
}

// ─── Submit new request (marketing) ────────────────────────────────────────
export async function createAuditRequest(
  dto: CreateAuditRequestDto,
): Promise<AuditRequest> {
  return fetchApi<AuditRequest>(`${AUDIT_REQUESTS_API_BASE_URL}/audit-requests`, {
    method: "POST",
    body: JSON.stringify(dto),
  });
}

// ─── Update (marketing edits before scheduling) ────────────────────────────
export async function updateAuditRequest(
  id: number,
  dto: UpdateAuditRequestDto,
): Promise<AuditRequest> {
  return fetchApi<AuditRequest>(
    `${AUDIT_REQUESTS_API_BASE_URL}/audit-requests/${id}`,
    { method: "PATCH", body: JSON.stringify(dto) },
  );
}

// ─── Mark under review (coordinator opens) ─────────────────────────────────
// Auto-triggered when coordinator opens the detail page for the first time
export async function markAuditRequestUnderReview(
  id: number,
): Promise<AuditRequest> {
  return fetchApi<AuditRequest>(
    `${AUDIT_REQUESTS_API_BASE_URL}/audit-requests/${id}/review`,
    { method: "PATCH" },
  );
}

// ─── ⭐ Schedule the request (coordinator) ─────────────────────────────────
// Creates audit_schedule_row + links back to the request — all in one transaction
export async function scheduleAuditRequest(
  id: number,
  dto: ScheduleAuditRequestDto,
): Promise<AuditRequest> {
  return fetchApi<AuditRequest>(
    `${AUDIT_REQUESTS_API_BASE_URL}/audit-requests/${id}/schedule`,
    { method: "POST", body: JSON.stringify(dto) },
  );
}

// ─── Reject (coordinator) ──────────────────────────────────────────────────
export async function rejectAuditRequest(
  id: number,
  dto: RejectAuditRequestDto,
): Promise<AuditRequest> {
  return fetchApi<AuditRequest>(
    `${AUDIT_REQUESTS_API_BASE_URL}/audit-requests/${id}/reject`,
    { method: "PATCH", body: JSON.stringify(dto) },
  );
}

// ─── Cancel (marketing or coordinator) ─────────────────────────────────────
export async function cancelAuditRequest(
  id: number,
  dto: CancelAuditRequestDto,
): Promise<AuditRequest> {
  return fetchApi<AuditRequest>(
    `${AUDIT_REQUESTS_API_BASE_URL}/audit-requests/${id}/cancel`,
    { method: "PATCH", body: JSON.stringify(dto) },
  );
}
// ─── Delete an audit request ───────────────────────────────────────────────
// Backend enforces permission + ownership + status guards. A SCHEDULED
// request (linked to a real audit) is blocked server-side with a message.
export async function deleteAuditRequest(id: number): Promise<void> {
  await fetchApi<void>(
    `${AUDIT_REQUESTS_API_BASE_URL}/audit-requests/${id}`,
    { method: "DELETE" },
  );
}
export async function createBatchAuditRequest(
  dto: CreateBatchAuditRequestPayload,           // ← was CreateBatchAuditRequestDto
): Promise<CreateBatchAuditRequestResult> {
  return fetchApi<CreateBatchAuditRequestResult>(
    `${AUDIT_REQUESTS_API_BASE_URL}/audit-requests/batch`,
    {
      method: "POST",
      body: JSON.stringify(dto),
    },
  );
}

// ═══════════════════════════════════════════════════════════════════════
// 🆕 PROCEED TO INQUIRY
// ═══════════════════════════════════════════════════════════════════════

// Single request → inquiry (popup submit). Empty payload {} is valid —
// every omitted field falls back server-side to the request's own values.
export async function proceedToInquiry(
  id: number,
  payload: ProceedToInquiryPayload = {},
): Promise<ProceedToInquiryResult> {
  return fetchApi<ProceedToInquiryResult>(
    `${AUDIT_REQUESTS_API_BASE_URL}/audit-requests/${id}/proceed-to-inquiry`,
    { method: "POST", body: JSON.stringify(payload) },
  );
}

// Batch (checkbox multi-select) → one inquiry per request; per-row results.
export async function proceedBatchToInquiry(
  payload: ProceedBatchToInquiryPayload,
): Promise<ProceedBatchToInquiryResult> {
  return fetchApi<ProceedBatchToInquiryResult>(
    `${AUDIT_REQUESTS_API_BASE_URL}/audit-requests/proceed-to-inquiry/batch`,
    { method: "POST", body: JSON.stringify(payload) },
  );
}

// 🆕 ─── Slot system ─────────────────────────────────────────────────────────
// Returns the submission window (today → today+2) and which dates within
// it are available vs blocked by the 7-day gap rule.
// Frontend calls this on form open to populate the date picker.
export async function getAvailableSlots(): Promise<AvailableSlotsResponse> {
  return fetchApi<AvailableSlotsResponse>(
    `${AUDIT_REQUESTS_API_BASE_URL}/audit-requests/available-slots`,
  );
}