import { fetchApi } from "@/lib/api/http";  // ✅ ADD THIS
import type {
  Company,
  CreateCompanyDto,
  UpdateCompanyDto,
  PaginatedCompaniesResponse,
  PortalUser,                              // 🆕
} from "@/lib/api/types/company.types";

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

// ✅ DELETE getAuthToken() entirely
// ✅ DELETE fetchCompanyApi() entirely

export interface CompanyQueryParams {
  page?: number;
  limit?: number;
  search?: string;
  city?: string;
  standard?: string;
  month?: string;
  startDate?: string;
  endDate?: string;
}

export async function getCompaniesPaginated(
  params: CompanyQueryParams = {}
): Promise<PaginatedCompaniesResponse> {
  const { page = 1, limit = 10, search, city, standard, month, startDate, endDate } = params;
  const query = new URLSearchParams();
  query.set("page",  String(page));
  query.set("limit", String(limit));
  if (search)    query.set("search",    search);
  if (city)      query.set("city",      city);
  if (standard)  query.set("standard",  standard);
  if (month)     query.set("month",     month);
  if (startDate) query.set("startDate", startDate);
  if (endDate)   query.set("endDate",   endDate);
  return fetchApi<PaginatedCompaniesResponse>(
    `${COMPANIES_API_BASE_URL}/companies?${query.toString()}`
  );
}

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

export async function getCompany(id: number): Promise<Company> {
  return fetchApi<Company>(`${COMPANIES_API_BASE_URL}/companies/${id}`);
}

export async function createCompany(dto: CreateCompanyDto): Promise<Company> {
  return fetchApi<Company>(`${COMPANIES_API_BASE_URL}/companies`, {
    method: "POST",
    body: JSON.stringify(dto),
  });
}

export async function updateCompany(id: number, dto: UpdateCompanyDto): Promise<Company> {
  return fetchApi<Company>(`${COMPANIES_API_BASE_URL}/companies/${id}`, {
    method: "PATCH",
    body: JSON.stringify(dto),
  });
}

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

// ═══════════════════════════════════════════════════════════════════════════
// 🆕 ISSUE 5 & 6 — Portal access API functions
//    Maps to the new endpoints in CompaniesController.
// ═══════════════════════════════════════════════════════════════════════════

/** GET /companies/:id/portal-users — list all portal users for a company */
export async function getPortalUsers(companyId: number): Promise<PortalUser[]> {
  return fetchApi<PortalUser[]>(
    `${COMPANIES_API_BASE_URL}/companies/${companyId}/portal-users`
  );
}

/** POST /companies/:id/portal-access — grant portal access */
export async function grantPortalAccess(
  companyId: number,
  userId: number,
  email: string,
): Promise<PortalUser> {
  return fetchApi<PortalUser>(
    `${COMPANIES_API_BASE_URL}/companies/${companyId}/portal-access`,
    {
      method: "POST",
      body: JSON.stringify({ user_id: userId, email }),
    },
  );
}

/** PATCH /companies/:id/portal-access/:userId/disable — disable one user */
export async function disablePortalAccess(
  companyId: number,
  userId: number,
): Promise<PortalUser> {
  return fetchApi<PortalUser>(
    `${COMPANIES_API_BASE_URL}/companies/${companyId}/portal-access/${userId}/disable`,
    { method: "PATCH" },
  );
}

/** PATCH /companies/:id/portal-access/:userId/enable — re-enable one user */
export async function enablePortalAccess(
  companyId: number,
  userId: number,
): Promise<PortalUser> {
  return fetchApi<PortalUser>(
    `${COMPANIES_API_BASE_URL}/companies/${companyId}/portal-access/${userId}/enable`,
    { method: "PATCH" },
  );
}

/** POST /companies/:id/portal-access/disable-all — emergency kill switch */
export async function disableAllPortalAccess(
  companyId: number,
): Promise<{ disabled: number }> {
  return fetchApi<{ disabled: number }>(
    `${COMPANIES_API_BASE_URL}/companies/${companyId}/portal-access/disable-all`,
    { method: "POST" },
  );
}

/** DELETE /companies/:id/portal-access/:userId — permanent revoke */
export async function revokePortalAccess(
  companyId: number,
  userId: number,
): Promise<{ message: string }> {
  return fetchApi<{ message: string }>(
    `${COMPANIES_API_BASE_URL}/companies/${companyId}/portal-access/${userId}`,
    { method: "DELETE" },
  );
}