import {
  ConvertFormdataToJSON,
  ServerAction,
  ServerResponse,
} from "@/lib/actions";
import { validate } from "@/lib/encryption";
import { CodesStatusMap } from "@/models/codes";
import { RowDataPacket } from "mysql2";

export default async function confirmaccount(formData: FormData) {
  const { con, dict } = await ServerAction();

  if ("error" in con) {
    return ServerResponse({
      operation: false,
      message: dict.alerts.general.connection_fail,
    });
  }

  try {
    const { user, code, password } = ConvertFormdataToJSON(formData);

    if (password) {
      const [passwordResult] = await con.query<RowDataPacket[]>(
        "SELECT * FROM USERS WHERE EMAIL = ?",
        [user],
      );

      if (!passwordResult.length) {
        return ServerResponse({
          operation: false,
          message: dict.alerts.change_password.error.user_not_found,
        });
      }

      const isValid = await validate(
        String(password),
        passwordResult[0].PASSWORD,
      );

      if (!isValid) {
        return ServerResponse({
          operation: false,
          message: dict.alerts.change_password.error.pass_not_match,
        });
      }

      return ServerResponse({
        operation: true,
        message: dict.alerts.change_password.success.change,
      });
    }

    const sql = `
      SELECT
       C.*,
       U.EMAIL
      FROM CODES C
      JOIN USERS U ON C.USER = U.ID
      WHERE CODE = ? AND U.EMAIL = ?
    `;
    const params = [code, user];

    const [userResult] = await con.query<RowDataPacket[]>(sql, params);

    if (!userResult.length) {
      return ServerResponse({
        operation: false,
        message: dict.alerts.change_password.error.code_not_match,
      });
    }

    const created_at = userResult[0].CREATED_AT;
    const now = new Date();

    const diffInMilliseconds = now.getTime() - created_at.getTime();
    const diffInHours = diffInMilliseconds / (1000 * 60 * 60);

    if (diffInHours > 2) {
      await con.query("UPDATE CODES SET STATUS = ? WHERE ID = ?", [
        CodesStatusMap.Expired,
        userResult[0].ID,
      ]);
      return ServerResponse({
        operation: false,
        message: dict.alerts.change_password.error.code_expired,
      });
    }

    await con.query("UPDATE CODES SET STATUS = ? WHERE ID = ?", [
      CodesStatusMap.Used,
      userResult[0].ID,
    ]);

    return ServerResponse({
      operation: true,
      message: dict.alerts.change_password.success.is_valid,
      data: userResult,
    });
  } catch (error) {
    return ServerResponse({
      operation: false,
      message: dict.alerts.general.unexpected_error,
      data: error,
    });
  } finally {
    con.release();
  }
}
