import { fetchApi } from "@/lib/api/http";
import type {
  AuditStage,
  CreateAuditStageDto,
  UpdateAuditStageDto,
  PaginatedAuditStagesResponse,
} from "@/lib/api/types/auditStage.types";

// ─── Base URL (port 3008 for audit stages) ────────────────────────────────────
// Set NEXT_PUBLIC_AUDIT_STAGES_API_URL=http://localhost:3008/api in .env.local
export const AUDIT_STAGES_API_BASE_URL =
  process.env.NEXT_PUBLIC_AUDIT_STAGES_API_URL ?? "http://localhost:3007/api";

// ─── Query params ─────────────────────────────────────────────────────────────
export interface AuditStageQueryParams {
  page?:   number;
  limit?:  number;
  search?: string;
}

// ─── READ ─────────────────────────────────────────────────────────────────────

export async function getAuditStagesPaginated(
  params: AuditStageQueryParams = {}
): Promise<PaginatedAuditStagesResponse> {
  const { page = 1, limit = 10, search } = params; // ✅ default 50 → 10

  const query = new URLSearchParams();
  query.set("page",  String(page));
  query.set("limit", String(limit));
  if (search) query.set("search", search);

  const res = await fetchApi<any>(
    `${AUDIT_STAGES_API_BASE_URL}/company-audit-stages?${query.toString()}`
  );

  // Normalise: backend may return plain array or paginated object
  if (Array.isArray(res)) {
    // ✅ FIX: slice array so client-side pagination works correctly
    const total      = res.length;
    const totalPages = Math.ceil(total / limit) || 1;
    const start      = (page - 1) * limit;
    const sliced     = res.slice(start, start + limit);
    return {
      data: sliced,
      meta: {
        total,
        page,
        limit,
        totalPages,
        hasNextPage: page < totalPages,
        hasPrevPage: page > 1,
      },
    };
  }
  return res;
}

export async function getAllAuditStages(): Promise<AuditStage[]> {
  const first = await getAuditStagesPaginated({ page: 1, limit: 200 });
  if (first.meta.totalPages <= 1) return first.data;
  const rest = await Promise.all(
    Array.from({ length: first.meta.totalPages - 1 }, (_, i) =>
      getAuditStagesPaginated({ page: i + 2, limit: 200 }).then((r) => r.data)
    )
  );
  return [...first.data, ...rest.flat()];
}

export async function getAuditStage(id: number): Promise<AuditStage> {
  return fetchApi<AuditStage>(
    `${AUDIT_STAGES_API_BASE_URL}/company-audit-stages/${id}`
  );
}

// ─── WRITE ────────────────────────────────────────────────────────────────────

export async function createAuditStage(dto: CreateAuditStageDto): Promise<AuditStage> {
  return fetchApi<AuditStage>(`${AUDIT_STAGES_API_BASE_URL}/company-audit-stages`, {
    method: "POST",
    body:   JSON.stringify(dto),
  });
}

export async function updateAuditStage(
  id: number,
  dto: UpdateAuditStageDto
): Promise<AuditStage> {
  return fetchApi<AuditStage>(
    `${AUDIT_STAGES_API_BASE_URL}/company-audit-stages/${id}`,
    { method: "PATCH", body: JSON.stringify(dto) }
  );
}

export async function deleteAuditStage(id: number): Promise<void> {
  return fetchApi<void>(
    `${AUDIT_STAGES_API_BASE_URL}/company-audit-stages/${id}`,
    { method: "DELETE" }
  );
}

// ─── Dropdown helper ──────────────────────────────────────────────────────────
export interface SelectOption {
  value: number | string;
  label: string;
}

export async function getAuditStageSelectOptions(): Promise<SelectOption[]> {
  const stages = await getAllAuditStages();
  return stages
    .sort((a, b) => (a.order ?? 0) - (b.order ?? 0))
    .map((s) => ({ value: s.id, label: s.name }));
}
