export default function ConvertJSONToFormData(
  json: Record<string, any>,
): FormData {
  const formData = new FormData();
  
  function appendToFormData(obj: Record<string, any>, prefix: string = "") {
    for (const [key, value] of Object.entries(obj)) {
      const newKey = prefix ? `${prefix}-${key}` : key;

      switch (true) {
        case value instanceof File:
          formData.append(newKey, value, value.name);
          break;
        case Array.isArray(value) && value[0] instanceof File:
          value.forEach((file, index) => {
            formData.append(`${newKey}-${index}`, file, file.name);
          });
          break;
        case Array.isArray(value):
          value.forEach((item, index) => {
            appendToFormData({ [`${newKey}-${index}`]: item });
          });
          break;
        case typeof value === "object" && value !== null:
          appendToFormData(value, newKey);
          break;
        case typeof value === "boolean":
          formData.append(newKey, value.toString());
          break;
        case typeof value === "number":
          formData.append(newKey, value.toString());
          break;
        case value === null:
          formData.append(newKey, "");
          break;
        default:
          formData.append(newKey, value?.toString() ?? "");
      }
    }
  }

  appendToFormData(json);
  
  return formData;
}
