import { ServerAction, ServerResponse } from "@/lib/actions";
import { codeGenerator } from "@/lib/utils";
import { CodesReasonMap, CodesStatusMap } from "@/models/codes";
import { ResultSetHeader } from "mysql2";
import { v4 } from "uuid";
import { sendMail } from "../nodemailer";
import compilers from "@/models/email";

export default async function requestCode(data: FormData) {
  const { con, dict } = await ServerAction();

  if ("error" in con) {
    return ServerResponse({
      operation: false,
      message: dict.alerts.general.connection_fail,
    });
  }

  const user = data.get("user-email");

  if (!user) {
    return ServerResponse({
      operation: false,
      message: dict.alerts.change_password.error.send_credential,
    });
  }

  try {
    const code = codeGenerator(6);

    const sql = `
    INSERT INTO CODES (ID, CODE, REASON, STATUS, USER) VALUES (?, ?, ?, ?, (
        SELECT 
            ID 
        FROM USERS 
        WHERE EMAIL = ?
    ))
    `;
    const params: string[] = [
      v4(),
      code,
      CodesReasonMap.PasswordRecovery.toString(),
      CodesStatusMap.Available.toString(),
      user as string,
    ];

    const [result] = await con.query<ResultSetHeader>(sql, params);

    if (result.affectedRows === 0) {
      return ServerResponse({
        operation: false,
        message: dict.alerts.change_password.error.send_code,
      });
    }

    await sendMail({
      subject: "Confirmation code",
      optText: compilers.code_request({ code }),
      toEmail: user as string,
    })

    return ServerResponse({
      operation: true,
      message: dict.alerts.change_password.success.send_code,
    });
  } catch (error) {
    return ServerResponse({
      operation: false,
      message: dict.alerts.general.unexpected_error,
      data: error,
    });
  } finally {
    con.release();
  }
}
