"use server";

import { ServerAction, ServerRequest, ServerResponse } from "@/lib/actions";
import { convertKeysToLowercase } from "@/lib/utils";
import { ResultSetHeader, RowDataPacket } from "mysql2";
import downloadSubdomainFiles from "../files/downloadSubdomainFiles";

export const makeProjectLink = async (formData: FormData) => {
  const { error, con, dict } = await ServerAction();

  if (error) {
    return ServerResponse({
      operation: false,
      data: error,
    });
  }

  const user = formData.get("user") as string;
  const title = formData.get("title") as string;

  try {
    await con.beginTransaction();

    formData.append("permanent", "1");

    const downloadFileResult = await ServerRequest<rDownloadSubdomainFiles>(
      downloadSubdomainFiles(formData),
    );

    if (!downloadFileResult.operation) {
      await con.rollback();
      return ServerResponse(downloadFileResult);
    }

    const { uuid, link } = downloadFileResult.data;

    const [result] = await con.query<ResultSetHeader>(
      "INSERT INTO DOWNLOADLINKS (ID, TITLE, HREF, USER) VALUES (?, ?, ?, ?)",
      [uuid, title, link, user],
    );

    const [inserted] = await con.query<RowDataPacket[]>(
      "SELECT DL.*, U.NAME as USER, U.EMAIL FROM DOWNLOADLINKS DL JOIN USERS U ON U.ID = DL.USER WHERE DL.ID = ?",
      [uuid],
    );

    if (inserted.length === 0) {
      await con.rollback();

      return ServerResponse({
        operation: false,
        message: dict.alerts.make_project_download_link.error,
      });
    }

    await con.commit();
    return ServerResponse({
      operation: true,
      message: dict.alerts.make_project_download_link.success,
      data: convertKeysToLowercase(inserted[0]),
    });
  } catch (error) {
    await con.rollback();

    return ServerResponse({
      operation: false,
      message: dict.alerts.general.unexpected_error,
      data: error,
    });
  } finally {
    con.release();
  }
};
