import { fetchApi } from "@/lib/api/http";
import type {
  AuditSchedule,
  AuditRow,
  AuditTrailEntry,
  AuditAnalytics,
  CreateAuditScheduleDto,
  UpdateAuditScheduleDto,
  CreateAuditRowDto,
  UpdateAuditRowDto,
  CancelRowDto,
  RescheduleRowDto,
  BulkCancelDto,
  AuditScheduleQueryParams,
  PaginatedAuditSchedulesResponse,
} from "@/lib/api/types/audit-schedule.types";

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

// ─── List (paginated) ──────────────────────────────────────────────────────
export async function getAuditSchedulesPaginated(
  params: AuditScheduleQueryParams = {},
): Promise<PaginatedAuditSchedulesResponse> {
  const { page = 1, limit = 25, status, date_from, date_to, client_group, search } = params;
  const q = new URLSearchParams();
  q.set("page", String(page));
  q.set("limit", String(limit));
  if (status) q.set("status", status);
  if (date_from) q.set("date_from", date_from);
  if (date_to) q.set("date_to", date_to);
  if (client_group) q.set("client_group", client_group);
  if (search) q.set("search", search);

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

  // Normalize to the flat shape that matches your existing pagination convention
  // (your PaginatedCertificatesResponse uses { data, total, page, lastPage })
  // — defends against either { data, meta:{...} } or flat { data, total, lastPage } from backend.
  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 getAuditSchedule(id: number): Promise<AuditSchedule> {
  return fetchApi<AuditSchedule>(
    `${AUDIT_SCHEDULES_API_BASE_URL}/audit-schedules/${id}`,
  );
}

// ─── Get by date ───────────────────────────────────────────────────────────
export async function getAuditScheduleByDate(date: string): Promise<AuditSchedule | null> {
  return fetchApi<AuditSchedule | null>(
    `${AUDIT_SCHEDULES_API_BASE_URL}/audit-schedules/by-date/${date}`,
  );
}

// ─── Analytics ─────────────────────────────────────────────────────────────
export async function getAuditAnalytics(params?: {
  date_from?: string;
  date_to?: string;
}): Promise<AuditAnalytics> {
  const q = new URLSearchParams();
  if (params?.date_from) q.set("date_from", params.date_from);
  if (params?.date_to) q.set("date_to", params.date_to);
  const qs = q.toString();
  return fetchApi<AuditAnalytics>(
    `${AUDIT_SCHEDULES_API_BASE_URL}/audit-schedules/analytics${qs ? `?${qs}` : ""}`,
  );
}

// ─── Create schedule ───────────────────────────────────────────────────────
export async function createAuditSchedule(
  dto: CreateAuditScheduleDto,
): Promise<AuditSchedule> {
  return fetchApi<AuditSchedule>(`${AUDIT_SCHEDULES_API_BASE_URL}/audit-schedules`, {
    method: "POST",
    body: JSON.stringify(dto),
  });
}

// ─── Update schedule (meta or status) ──────────────────────────────────────
export async function updateAuditSchedule(
  id: number,
  dto: UpdateAuditScheduleDto,
): Promise<AuditSchedule> {
  return fetchApi<AuditSchedule>(
    `${AUDIT_SCHEDULES_API_BASE_URL}/audit-schedules/${id}`,
    { method: "PATCH", body: JSON.stringify(dto) },
  );
}

// ─── Delete schedule ───────────────────────────────────────────────────────
export async function deleteAuditSchedule(id: number): Promise<void> {
  return fetchApi<void>(
    `${AUDIT_SCHEDULES_API_BASE_URL}/audit-schedules/${id}`,
    { method: "DELETE" },
  );
}

// ─── Row operations ────────────────────────────────────────────────────────
export async function addAuditRow(
  scheduleId: number,
  dto: CreateAuditRowDto,
): Promise<AuditRow> {
  return fetchApi<AuditRow>(
    `${AUDIT_SCHEDULES_API_BASE_URL}/audit-schedules/${scheduleId}/rows`,
    { method: "POST", body: JSON.stringify(dto) },
  );
}

export async function updateAuditRow(
  scheduleId: number,
  rowId: number,
  dto: UpdateAuditRowDto,
): Promise<AuditRow> {
  return fetchApi<AuditRow>(
    `${AUDIT_SCHEDULES_API_BASE_URL}/audit-schedules/${scheduleId}/rows/${rowId}`,
    { method: "PATCH", body: JSON.stringify(dto) },
  );
}

export async function deleteAuditRow(
  scheduleId: number,
  rowId: number,
): Promise<void> {
  return fetchApi<void>(
    `${AUDIT_SCHEDULES_API_BASE_URL}/audit-schedules/${scheduleId}/rows/${rowId}`,
    { method: "DELETE" },
  );
}

// ─── Cancel row (TRIGGERS NOTIFICATIONS) ───────────────────────────────────
export async function cancelAuditRow(
  rowId: number,
  dto: CancelRowDto,
): Promise<AuditRow> {
  return fetchApi<AuditRow>(
    `${AUDIT_SCHEDULES_API_BASE_URL}/audit-schedules/rows/${rowId}/cancel`,
    { method: "POST", body: JSON.stringify(dto) },
  );
}

// ─── Reschedule row (TRIGGERS NOTIFICATIONS) ───────────────────────────────
export async function rescheduleAuditRow(
  rowId: number,
  dto: RescheduleRowDto,
): Promise<AuditRow> {
  return fetchApi<AuditRow>(
    `${AUDIT_SCHEDULES_API_BASE_URL}/audit-schedules/rows/${rowId}/reschedule`,
    { method: "POST", body: JSON.stringify(dto) },
  );
}

// ─── Bulk cancel schedule (TRIGGERS NOTIFICATIONS) ─────────────────────────
export async function bulkCancelAuditSchedule(
  scheduleId: number,
  dto: BulkCancelDto,
): Promise<{ message: string; cancelled_count: number }> {
  return fetchApi<{ message: string; cancelled_count: number }>(
    `${AUDIT_SCHEDULES_API_BASE_URL}/audit-schedules/${scheduleId}/bulk-cancel`,
    { method: "POST", body: JSON.stringify(dto) },
  );
}

// ─── Audit trail for a row ─────────────────────────────────────────────────
export async function getRowAuditTrail(rowId: number): Promise<AuditTrailEntry[]> {
  return fetchApi<AuditTrailEntry[]>(
    `${AUDIT_SCHEDULES_API_BASE_URL}/audit-schedules/rows/${rowId}/audit-trail`,
  );
}

// ─── Company audit history ─────────────────────────────────────────────────
export async function getCompanyAuditHistory(
  companyId: number,
  limit = 10,
): Promise<AuditRow[]> {
  const q = new URLSearchParams({ limit: String(limit) });
  return fetchApi<AuditRow[]>(
    `${AUDIT_SCHEDULES_API_BASE_URL}/audit-schedules/company/${companyId}/history?${q.toString()}`,
  );
}