import "server-only"

import crypto from "crypto"

import { env } from "@/env/server"

const algorithm = "DES-ECB"
const encryptionKey = env.BOOKING_ENCRYPTION_KEY
const bufferKey = Buffer.from(encryptionKey, "utf8")

export function encrypt(originalString: string) {
  try {
    const cipher = crypto.createCipheriv(algorithm, bufferKey, null)
    cipher.setAutoPadding(false)
    const bufferString = Buffer.from(originalString, "utf8")
    const paddingSize =
      bufferKey.length - (bufferString.length % bufferKey.length)
    const paddedStr = Buffer.concat([
      bufferString,
      Buffer.alloc(paddingSize, 0),
    ])
    const buffers: Buffer[] = []
    buffers.push(cipher.update(paddedStr))
    buffers.push(cipher.final())
    const result = Buffer.concat(buffers).toString("base64")
    return result
  } catch (e) {
    console.log(e)
    return ""
  }
}

export function decrypt(encryptedString: string) {
  try {
    const decipher = crypto.createDecipheriv(algorithm, bufferKey, null)
    decipher.setAutoPadding(false)
    const buffers: Buffer[] = []
    buffers.push(decipher.update(encryptedString, "base64"))
    buffers.push(decipher.final())
    const result = Buffer.concat(buffers)
      .toString("utf8")
      /*
       * Hexadecimal byte (null byte) replace. These occur when decrypting because
       * we're disabling the auto padding for historical/compatibility reasons.
       */
      .replace(/(\x00)*/g, "")
    return result
  } catch (e) {
    console.log(e)
    return ""
  }
}
