/**
 * ═══════════════════════════════════════════════════════════════
 * CLIENT PORTAL MANAGEMENT — API Layer
 * Mirrors the pattern from audit-request.api.ts
 * ═══════════════════════════════════════════════════════════════
 */
import { fetchApi } from "@/lib/api/http";

const API = process.env.NEXT_PUBLIC_API_URL || "http://localhost:3007/api";

// ── Types ───────────────────────────────────────────────────────
export interface PortalClient {
  company_id: number;
  user_id: number;
  role: string;
  status: "ACTIVE" | "INVITED" | "DISABLED";
  invite_email: string | null;
  granted_by_id: number | null;
  disabled_at: string | null;
  disabled_by_id: number | null;
  last_login_at: string | null;
  created_at: string;
  company?: {
    id: number;
    name: string;
    scheme?: string;
    contact_email?: string;
    contact_phone?: string;
  };
  user?: {
    id: number;
    firstName?: string;
    first_name?: string;
    lastName?: string;
    last_name?: string;
    email?: string;
  };
  granted_by?: {
    id: number;
    firstName?: string;
    first_name?: string;
    lastName?: string;
    last_name?: string;
  };
  disabled_by?: {
    id: number;
    firstName?: string;
    first_name?: string;
    lastName?: string;
    last_name?: string;
  };
}

export interface PortalClientRow extends PortalClient {
  sno: number;
  client_name: string;
  client_email: string;
  company_name: string;
  granted_by_name: string;
  disabled_by_name: string;
}

export interface ClientActivityLog {
  id: number;
  action: string;
  details: string;
  ip_address?: string;
  device?: string;      // 👈 add
  browser?: string;     // 👈 add
  device_type?: string; // 👈 add (optional)
  created_at: string;
  user?: { firstName?: string; lastName?: string; email?: string };
}

export interface PaginatedResponse<T> {
  data: T[];
  total: number;
  page: number;
  lastPage: number;
  limit: number;
}

// ── Helpers ─────────────────────────────────────────────────────
function userName(u: any): string {
  if (!u) return "—";
  const first = u.firstName || u.first_name || "";
  const last = u.lastName || u.last_name || "";
  const name = `${first} ${last}`.trim();
  return name || u.email || `User #${u.id}`;
}

export function mapPortalClient(
  raw: PortalClient,
  index: number,
): PortalClientRow {
  return {
    ...raw,
    sno: index + 1,
    client_name: userName(raw.user),
    client_email: raw.user?.email || raw.invite_email || "—",
    company_name: raw.company?.name || `Company #${raw.company_id}`,
    granted_by_name: userName(raw.granted_by),
    disabled_by_name: userName(raw.disabled_by),
  };
}

// ── API Calls ───────────────────────────────────────────────────

/** Get all portal users for a company */
export async function getPortalUsers(
  companyId: number,
): Promise<PortalClientRow[]> {
  const res = await fetchApi<any>(
    `${API}/companies/${companyId}/portal-users`,
  );
  const list = Array.isArray(res) ? res : res?.data ?? [];
  return list.map((r: PortalClient, i: number) => mapPortalClient(r, i));
}

/** Get all portal users across all companies (admin view) */
export async function getAllPortalUsers(params?: {
  page?: number;
  limit?: number;
  search?: string;
  status?: string;
  company_id?: number;
}): Promise<PaginatedResponse<PortalClientRow>> {
  const qs = new URLSearchParams();
  if (params?.page) qs.set("page", String(params.page));
  if (params?.limit) qs.set("limit", String(params.limit));
  if (params?.search) qs.set("search", params.search);
  if (params?.status && params.status !== "all")
    qs.set("status", params.status);
  if (params?.company_id) qs.set("company_id", String(params.company_id));

  const url = `${API}/companies/portal-users${qs.toString() ? `?${qs}` : ""}`;
  const res = await fetchApi<any>(url);

  // Handle different response shapes
  const raw = Array.isArray(res)
    ? res
    : Array.isArray(res?.data)
      ? res.data
      : [];
  const total = res?.total ?? res?.meta?.total ?? raw.length;
  const page = res?.page ?? res?.meta?.page ?? params?.page ?? 1;
  const limit = res?.limit ?? res?.meta?.limit ?? params?.limit ?? 10;
  const lastPage =
    (res?.lastPage ?? res?.meta?.totalPages ?? Math.ceil(total / limit)) || 1;

  return {
    data: raw.map((r: PortalClient, i: number) =>
      mapPortalClient(r, (page - 1) * limit + i),
    ),
    total,
    page,
    lastPage,
    limit,
  };
}

/** Invite a client to the portal */
export async function inviteClient(payload: {
  company_id: number;
  client_email: string;
  client_phone: string;
}): Promise<any> {
  return fetchApi<any>(`${API}/client-portal/invite`, {
    method: "POST",
    body: JSON.stringify(payload),
  });
}

/** Resend invitation — calls the same invite endpoint */
export async function resendInvitation(payload: {
  company_id: number;
  client_email: string;
  client_phone: string;
}): Promise<any> {
  return fetchApi<any>(`${API}/client-portal/invite`, {
    method: "POST",
    body: JSON.stringify(payload),
  });
}

/** Enable portal access (re-activate disabled user) */
export async function enablePortalAccess(
  companyId: number,
  userId: number,
): Promise<any> {
  return fetchApi<any>(
    `${API}/companies/${companyId}/portal-users/${userId}/enable`,
    { method: "PATCH" },
  );
}

/** Disable portal access */
export async function disablePortalAccess(
  companyId: number,
  userId: number,
): Promise<any> {
  return fetchApi<any>(
    `${API}/companies/${companyId}/portal-users/${userId}/disable`,
    { method: "PATCH" },
  );
}

/** Toggle report access for a client */
export async function toggleReportAccess(
  companyId: number,
  userId: number,
  enabled: boolean,
): Promise<any> {
  return fetchApi<any>(
    `${API}/companies/${companyId}/portal-users/${userId}/report-access`,
    {
      method: "PATCH",
      body: JSON.stringify({ report_enabled: enabled }),
    },
  );
}

/** Get client activity log */
export async function getClientActivityLog(
  companyId: number,
  userId: number,
  params?: { page?: number; limit?: number },
): Promise<PaginatedResponse<ClientActivityLog>> {
  const qs = new URLSearchParams();
  if (params?.page) qs.set("page", String(params.page));
  if (params?.limit) qs.set("limit", String(params.limit));

  const url = `${API}/companies/${companyId}/portal-users/${userId}/activity-log${qs.toString() ? `?${qs}` : ""}`;
  const res = await fetchApi<any>(url);
  const raw = Array.isArray(res) ? res : res?.data ?? [];
  return {
    data: raw,
    total: res?.total ?? raw.length,
    page: res?.page ?? 1,
    lastPage: res?.lastPage ?? 1,
    limit: res?.limit ?? 20,
  };
}

/** Get companies list for dropdown */
export async function getCompaniesForDropdown(): Promise<
  { id: number; name: string }[]
> {
  const res = await fetchApi<any>(`${API}/companies`);
  const list = Array.isArray(res) ? res : res?.data ?? [];
  return list.map((c: any) => ({ id: c.id, name: c.name || `#${c.id}` }));
}
