import { fetchApi } from "@/lib/api/http";
import type {
  Job,
  AuditStage,
  JobAuditor,
  CreateJobDto,
  UpdateJobDto,
  PaginatedJobsResponse,
  SelectOption,
} from "@/lib/api/types/job.types";

export const JOBS_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";

// ─── Jobs ─────────────────────────────────────────────────────────────────────

export interface JobQueryParams {
  page?:      number;
  limit?:     number;
  search?:    string;
  stage?:     string;
  companyId?: number;
  startDate?: string;
  endDate?:   string;
}

export async function getJobsPaginated(
  params: JobQueryParams = {}
): Promise<PaginatedJobsResponse> {
  const { page = 1, limit = 10, search, stage, companyId, startDate, endDate } = params;
  const query = new URLSearchParams();
  query.set("page",  String(page));
  query.set("limit", String(limit));
  if (search)    query.set("search",    search);
  if (stage)     query.set("stage",     stage);
  if (companyId) query.set("companyId", String(companyId));
  if (startDate) query.set("startDate", startDate);
  if (endDate)   query.set("endDate",   endDate);

  const res = await fetchApi<any>(`${JOBS_API_BASE_URL}/jobs?${query.toString()}`);
  if (Array.isArray(res)) {
    return { data: res, meta: { total: res.length, page: 1, limit: res.length, totalPages: 1, hasNextPage: false, hasPrevPage: false } };
  }
  return res;
}

export async function getAllJobs(): Promise<Job[]> {
  const first = await getJobsPaginated({ 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) =>
      getJobsPaginated({ page: i + 2, limit: 500 }).then((r) => r.data)
    )
  );
  return [...first.data, ...rest.flat()];
}

export async function getJob(id: number): Promise<Job> {
  return fetchApi<Job>(`${JOBS_API_BASE_URL}/jobs/${id}`);
}

export async function createJob(dto: CreateJobDto): Promise<Job> {
  return fetchApi<Job>(`${JOBS_API_BASE_URL}/jobs`, {
    method: "POST",
    body:   JSON.stringify(dto),
  });
}

export async function updateJob(id: number, dto: UpdateJobDto): Promise<Job> {
  return fetchApi<Job>(`${JOBS_API_BASE_URL}/jobs/${id}`, {
    method: "PATCH",
    body:   JSON.stringify(dto),
  });
}

export async function deleteJob(id: number): Promise<void> {
  return fetchApi<void>(`${JOBS_API_BASE_URL}/jobs/${id}`, {
    method: "DELETE",
  });
}

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

// ✅ Companies — async search (7442 records, never load all at once)
export async function searchCompanies(search = "", limit = 50): Promise<SelectOption[]> {
  const query = new URLSearchParams({ limit: String(limit) });
  if (search) query.set("search", search);
  const res = await fetchApi<any>(`${JOBS_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 }));
}

// ✅ Standards (flat list, safe to load all)
export async function getStandardOptions(): Promise<SelectOption[]> {
  const res = await fetchApi<any>(`${JOBS_API_BASE_URL}/standards`);
  const arr = Array.isArray(res) ? res : res?.data ?? [];
  return arr.map((s: any) => ({ value: s.id, label: s.name }));
}

// ✅ Templates (load all)
export async function getTemplateOptions(): Promise<SelectOption[]> {
  const res = await fetchApi<any>(`${JOBS_API_BASE_URL}/templates`);
  const arr = Array.isArray(res) ? res : res?.data ?? [];
  return arr.map((t: any) => ({ value: t.id, label: `${t.name} (${t.stageName ?? ""})` }));
}

// ✅ Audit Stages — from /company-audit-stages
export async function getAuditStageOptions(): Promise<SelectOption[]> {
  const res = await fetchApi<any>(`${JOBS_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 }));
}

// ✅ Auditors — from main API /users
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,
  }));
}
