import {
  ConvertFormdataToJSON,
  ConvertQueryResultToJSON,
  ServerAction,
  ServerResponse,
} from "@/lib/actions";
import { TableService } from "../table/service";

export default async function fetchAllUsers(formData?: FormData) {
  const { error, con, dict } = await ServerAction();

  if (error) {
    return ServerResponse({
      operation: false,
      data: error,
    });
  }

  try {
    const { ...filters } = ConvertFormdataToJSON(formData);

    const tableService = new TableService(con);

    const orWhere = filters.search.fields.map((f) => `UPPER(U.${f}) LIKE ?`);
    const params: any[] = filters.search.fields.map(
      (f) => `%${filters.search.text}%`,
    );

    const count = await tableService.query({
      table: "USERS U",
      select: ["COUNT(*) AS TOTAL"],
      orWhere,
      params,
    });

    const users = await tableService.query({
      table: "USERS U",
      select: ["U.*"],
      orWhere,
      orderBy: ["U.NAME"],
      limit: [
        filters.pagination.pageSize,
        filters.pagination.pageIndex * filters.pagination.pageSize,
      ],
      params,
    });

    return ServerResponse({
      operation: true,
      data: {
        list: ConvertQueryResultToJSON(users.data),
        count: count.data[0].TOTAL,
      },
    });
  } catch (error) {
    return ServerResponse({
      operation: true,
      message: dict.alerts.general.unexpected_error,
      data: error,
    });
  } finally {
    con.release();
  }
}
