"use server";

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

export const fetchDownloadLinks = async (formData?: FormData) => {
  const { error, con, dict } = await ServerAction();

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

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

    const tableService = new TableService(con);

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

    const count = last
      ? { operation: true, data: [{ TOTAL: 0 }] }
      : await tableService.query({
          table: "DOWNLOADLINKS DL",
          select: ["COUNT(*) AS TOTAL"],
          where: ["DL.EXPIRED = 0"],
          orWhere,
          params,
        });

    const links = await tableService.query({
      table: "DOWNLOADLINKS DL",
      select: ["DL.*", "U.NAME as USER", "U.EMAIL"],
      joins: ["LEFT JOIN USERS U ON DL.USER = U.ID"],
      where: ["DL.EXPIRED = 0"],
      orWhere,
      orderBy: ["CREATED_AT"],
      limit: last
        ? [1, 0]
        : [
            filters.pagination.pageSize,
            filters.pagination.pageIndex * filters.pagination.pageSize,
          ],
      params,
    });

    if (!links.operation) {
      return ServerResponse({
        operation: false,
        message: links.message,
      });
    }

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