import { fetchApi } from "@/lib/api/http";
import type {
  CompanyAudit,
  CreateCompanyAuditDto,
  UpdateCompanyAuditDto,
  PaginatedCompanyAuditsResponse,
} from "@/lib/api/types/companyAudit.types";

export const COMPANY_AUDITS_API_BASE_URL =
  process.env.NEXT_PUBLIC_API_BASE_URL ?? "http://localhost:3007/api";

export const MAIN_API_BASE_URL =
  process.env.NEXT_PUBLIC_API_BASE_URL ?? "http://localhost:3007/api";

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

// ─── Query params ─────────────────────────────────────────────────────────────
export interface CompanyAuditQueryParams {
  page?:         number;
  limit?:        number;
  search?:       string;
  companyId?:    number;
  auditStageId?: number;
  status?:       string;
  startDate?:    string;
  endDate?:      string;
}

// ─── CRUD ─────────────────────────────────────────────────────────────────────

// ─── CRUD ─────────────────────────────────────────────────────────────────────

export async function getCompanyAuditsPaginated(
  params: CompanyAuditQueryParams = {}
): Promise<PaginatedCompanyAuditsResponse> {
  const { page = 1, limit = 10, search, companyId, auditStageId, status, startDate, endDate } = params;
  const query = new URLSearchParams();
  query.set("page",  String(page));
  query.set("limit", String(limit));
  if (search)       query.set("search",       search);
  if (companyId)    query.set("companyId",    String(companyId));
  if (auditStageId) query.set("auditStageId", String(auditStageId));
  if (status)       query.set("status",       status);
  if (startDate)    query.set("startDate",    startDate);
  if (endDate)      query.set("endDate",      endDate);

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

  // Normalise: backend may return plain array or paginated object
  if (Array.isArray(res)) {
    // ✅ FIX: slice the 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 getAllCompanyAudits(): Promise<CompanyAudit[]> {
  const first = await getCompanyAuditsPaginated({ page: 1, limit: 500 });
  if (first.meta.totalPages <= 1) return first.data;
  const rest = await Promise.all(
    Array.from({ length: first.meta.totalPages - 1 }, (_, i) =>
      getCompanyAuditsPaginated({ page: i + 2, limit: 500 }).then((r) => r.data)
    )
  );
  return [...first.data, ...rest.flat()];
}

export async function getCompanyAudit(id: number): Promise<CompanyAudit> {
  return fetchApi<CompanyAudit>(
    `${COMPANY_AUDITS_API_BASE_URL}/company-audits/${id}`
  );
}

export async function createCompanyAudit(dto: CreateCompanyAuditDto): Promise<CompanyAudit> {
  return fetchApi<CompanyAudit>(`${COMPANY_AUDITS_API_BASE_URL}/company-audits`, {
    method: "POST",
    body:   JSON.stringify(dto),
  });
}

export async function updateCompanyAudit(id: number, dto: UpdateCompanyAuditDto): Promise<CompanyAudit> {
  return fetchApi<CompanyAudit>(`${COMPANY_AUDITS_API_BASE_URL}/company-audits/${id}`, {
    method: "PATCH",
    body:   JSON.stringify(dto),
  });
}

export async function deleteCompanyAudit(id: number): Promise<void> {
  return fetchApi<void>(`${COMPANY_AUDITS_API_BASE_URL}/company-audits/${id}`, {
    method: "DELETE",
  });
}

// ─── Dropdowns ────────────────────────────────────────────────────────────────

export async function getAuditStageOptions(): Promise<SelectOption[]> {
  const res = await fetchApi<any>(`${COMPANY_AUDITS_API_BASE_URL}/company-audit-stages`);
  const arr = Array.isArray(res) ? res : res?.data ?? [];
  return arr.map((a: any) => ({ value: a.id, label: a.name }));
}

export async function searchAuditCompanies(search = "", limit = 50): Promise<SelectOption[]> {
  const query = new URLSearchParams({ limit: String(limit) });
  if (search) query.set("search", search);
  const res = await fetchApi<any>(`${COMPANY_AUDITS_API_BASE_URL}/companies?${query.toString()}`);
  const arr = Array.isArray(res) ? res : res?.data ?? [];
  return arr.map((c: any) => ({ value: c.id, label: c.name }));
}

export async function getAuditorOptions(): Promise<SelectOption[]> {
  const res = await fetchApi<any>(`${MAIN_API_BASE_URL}/users`);
  const arr = Array.isArray(res) ? res : res?.data ?? [];
  return arr.map((u: any) => ({
    value: u.id,
    label: `${u.firstName ?? ""} ${u.lastName ?? ""}`.trim() || u.email,
  }));
}
