// ═══════════════════════════════════════════════════
//  app/lib/utils/user.utils.ts
// ═══════════════════════════════════════════════════

import { UserMapped } from "../types/user.types";
import * as XLSX from "xlsx";
/**
 * Filter users by search term (name or email)
 */
export function filterUsersBySearch(users: UserMapped[], term: string): UserMapped[] {
  if (!term.trim()) return users;
  const lower = term.toLowerCase();
  return users.filter(
    (u) =>
      u.fullName.toLowerCase().includes(lower) ||
      u.email.toLowerCase().includes(lower)
  );
}

/**
 * Filter users by status
 */
export function filterUsersByStatus(users: UserMapped[], status: string): UserMapped[] {
  switch (status) {
    case "active":
      return users.filter((u) => u.isApprovedByAdmin && u.isEmailVerified && u.isActive);
    case "pending":
      return users.filter((u) => u.isEmailVerified && !u.isApprovedByAdmin && u.status !== "rejected");
    case "unverified":
      return users.filter((u) => !u.isEmailVerified);
    case "rejected":
      return users.filter((u) => u.status === "rejected");
    case "inactive":
      return users.filter((u) => !u.isActive);
    default:
      return users;
  }
}

/**
 * Filter users by role ID
 */
export function filterUsersByRole(users: UserMapped[], roleId: string): UserMapped[] {
  if (roleId === "all") return users;
  return users.filter((u) => u.roles.some((r) => String(r.id) === roleId));
}

/**
 * Apply all filters at once
 */
export function applyUserFilters(
  users: UserMapped[],
  filters: {
    searchTerm: string;
    statusFilter: string;
    roleFilter: string;
  }
): UserMapped[] {
  let result = users;
  result = filterUsersBySearch(result, filters.searchTerm);
  result = filterUsersByStatus(result, filters.statusFilter);
  result = filterUsersByRole(result, filters.roleFilter);
  return result;
}

/**
 * Paginate an array
 */
export function paginate<T>(data: T[], page: number, perPage: number): T[] {
  const start = (page - 1) * perPage;
  return data.slice(start, start + perPage);
}

/**
 * Returns user stats counts
 */
export function getUserStats(users: UserMapped[]) {
  return {
    total: users.length,
    active: users.filter((u) => u.isApprovedByAdmin && u.isEmailVerified && u.isActive).length,
    pending: users.filter((u) => u.isEmailVerified && !u.isApprovedByAdmin && u.status !== "rejected").length,
    unverified: users.filter((u) => !u.isEmailVerified).length,
    rejected: users.filter((u) => u.status === "rejected").length,
  };
}
/**
 * Export users to an Excel file (First Name, Last Name, Email, Role)
 */
export function exportUsersToExcel(users: UserMapped[], filename = "users.xlsx") {
  const rows = users.map((u) => {
    const parts = u.fullName.trim().split(/\s+/);
    const firstName = parts[0] ?? "";
    const lastName = parts.slice(1).join(" ");

    const role = u.roles.map((r) => r.name).filter(Boolean).join(", ");

    return {
      "First Name": firstName,
      "Last Name": lastName,
      "Email": u.email,
      "Role": role,
    };
  });

  const worksheet = XLSX.utils.json_to_sheet(rows);
  worksheet["!cols"] = [{ wch: 18 }, { wch: 18 }, { wch: 28 }, { wch: 22 }];

  const workbook = XLSX.utils.book_new();
  XLSX.utils.book_append_sheet(workbook, worksheet, "Users");
  XLSX.writeFile(workbook, filename);
}