import {
  beginTransaction,
  commitTransaction,
  rollbackTransaction,
} from "@/database/configuration/connection";
import { ConvertFormdataToJSON, ServerAction } from "@/lib/actions";
import { encrypt } from "@/lib/encryption";
import { ServerResponse } from "@/lib/actions";
import { ResultSetHeader } from "mysql2";

export default async function changeUserPassword(formData: FormData) {
  const { con, dict } = await ServerAction();

  if ("error" in con) {
    return ServerResponse({
      operation: false,
      message: dict.alerts.general.connection_fail,
    });
  }

  try {
    const { user, password } = ConvertFormdataToJSON(formData);

    if (!user || !password) {
      return ServerResponse({
        operation: false,
        message: dict.alerts.change_password.error.send_credential,
      });
    }

    const hashPassword = await encrypt(password.toString());

    const sql = "UPDATE USERS SET PASSWORD = ? WHERE EMAIL = ?";
    const params: string[] = [hashPassword, user];

    await beginTransaction(con);

    const [result] = await con.query<ResultSetHeader>(sql, params);

    if (result.affectedRows === 0) {
      return ServerResponse({
        operation: false,
        message: dict.alerts.change_password.error.user_not_found,
      });
    }

    await commitTransaction(con);

    return ServerResponse({
      operation: true,
      message: dict.alerts.change_password.success.change,
    });
  } catch (error) {
    await rollbackTransaction(con);
    return ServerResponse({
      operation: false,
      message: dict.alerts.general.unexpected_error,
      data: error,
    });
  } finally {
    con.release();
  }
}
