import { serializeDocGenJobBaseV2025R0TypeField } from './docGenJobBaseV2025R0';
import { deserializeDocGenJobBaseV2025R0TypeField } from './docGenJobBaseV2025R0';
import { serializeDocGenJobBaseV2025R0 } from './docGenJobBaseV2025R0';
import { deserializeDocGenJobBaseV2025R0 } from './docGenJobBaseV2025R0';
import { serializeDocGenBatchBaseV2025R0 } from './docGenBatchBaseV2025R0';
import { deserializeDocGenBatchBaseV2025R0 } from './docGenBatchBaseV2025R0';
import { serializeFileReferenceV2025R0 } from './fileReferenceV2025R0';
import { deserializeFileReferenceV2025R0 } from './fileReferenceV2025R0';
import { serializeFileVersionBaseV2025R0 } from './fileVersionBaseV2025R0';
import { deserializeFileVersionBaseV2025R0 } from './fileVersionBaseV2025R0';
import { DocGenJobBaseV2025R0TypeField } from './docGenJobBaseV2025R0';
import { DocGenJobBaseV2025R0 } from './docGenJobBaseV2025R0';
import { DocGenBatchBaseV2025R0 } from './docGenBatchBaseV2025R0';
import { FileReferenceV2025R0 } from './fileReferenceV2025R0';
import { FileVersionBaseV2025R0 } from './fileVersionBaseV2025R0';
import { BoxSdkError } from '../../box/errors';
import { SerializedData } from '../../serialization/json';
import { sdIsEmpty } from '../../serialization/json';
import { sdIsBoolean } from '../../serialization/json';
import { sdIsNumber } from '../../serialization/json';
import { sdIsString } from '../../serialization/json';
import { sdIsList } from '../../serialization/json';
import { sdIsMap } from '../../serialization/json';
export type DocGenJobV2025R0StatusField =
  | 'submitted'
  | 'completed'
  | 'failed'
  | 'completed_with_error'
  | 'pending'
  | string;
export interface DocGenJobV2025R0FailuresField {
  /**
   * A list of errors that occurred during document generation. */
  readonly errors: readonly string[];
  /**
   * A list of warnings that occurred during document generation. */
  readonly warnings: readonly string[];
  readonly rawData?: SerializedData;
}
export class DocGenJobV2025R0 extends DocGenJobBaseV2025R0 {
  readonly batch!: DocGenBatchBaseV2025R0;
  readonly templateFile!: FileReferenceV2025R0;
  readonly templateFileVersion!: FileVersionBaseV2025R0;
  readonly outputFile?: FileReferenceV2025R0;
  readonly outputFileVersion?: FileVersionBaseV2025R0;
  readonly status!: DocGenJobV2025R0StatusField;
  readonly outputType!: string;
  readonly failures?: DocGenJobV2025R0FailuresField | null;
  constructor(fields: DocGenJobV2025R0) {
    super(fields);
    if (fields.batch !== undefined) {
      this.batch = fields.batch;
    }
    if (fields.templateFile !== undefined) {
      this.templateFile = fields.templateFile;
    }
    if (fields.templateFileVersion !== undefined) {
      this.templateFileVersion = fields.templateFileVersion;
    }
    if (fields.outputFile !== undefined) {
      this.outputFile = fields.outputFile;
    }
    if (fields.outputFileVersion !== undefined) {
      this.outputFileVersion = fields.outputFileVersion;
    }
    if (fields.status !== undefined) {
      this.status = fields.status;
    }
    if (fields.outputType !== undefined) {
      this.outputType = fields.outputType;
    }
    if (fields.failures !== undefined) {
      this.failures = fields.failures;
    }
  }
}
export function serializeDocGenJobV2025R0StatusField(
  val: DocGenJobV2025R0StatusField,
): SerializedData {
  return val;
}
export function deserializeDocGenJobV2025R0StatusField(
  val: SerializedData,
): DocGenJobV2025R0StatusField {
  if (val == 'submitted') {
    return val;
  }
  if (val == 'completed') {
    return val;
  }
  if (val == 'failed') {
    return val;
  }
  if (val == 'completed_with_error') {
    return val;
  }
  if (val == 'pending') {
    return val;
  }
  if (sdIsString(val)) {
    return val;
  }
  throw new BoxSdkError({
    message: "Can't deserialize DocGenJobV2025R0StatusField",
  });
}
export function serializeDocGenJobV2025R0FailuresField(
  val: DocGenJobV2025R0FailuresField,
): SerializedData {
  return {
    ['errors']: val.errors.map(function (item: string): SerializedData {
      return item;
    }) as readonly any[],
    ['warnings']: val.warnings.map(function (item: string): SerializedData {
      return item;
    }) as readonly any[],
  };
}
export function deserializeDocGenJobV2025R0FailuresField(
  val: SerializedData,
): DocGenJobV2025R0FailuresField {
  if (!sdIsMap(val)) {
    throw new BoxSdkError({
      message: 'Expecting a map for "DocGenJobV2025R0FailuresField"',
    });
  }
  if (val.errors == void 0) {
    throw new BoxSdkError({
      message:
        'Expecting "errors" of type "DocGenJobV2025R0FailuresField" to be defined',
    });
  }
  if (!sdIsList(val.errors)) {
    throw new BoxSdkError({
      message:
        'Expecting array for "errors" of type "DocGenJobV2025R0FailuresField"',
    });
  }
  const errors: readonly string[] = sdIsList(val.errors)
    ? (val.errors.map(function (itm: SerializedData): string {
        if (!sdIsString(itm)) {
          throw new BoxSdkError({
            message: 'Expecting string for "DocGenJobV2025R0FailuresField"',
          });
        }
        return itm;
      }) as readonly any[])
    : [];
  if (val.warnings == void 0) {
    throw new BoxSdkError({
      message:
        'Expecting "warnings" of type "DocGenJobV2025R0FailuresField" to be defined',
    });
  }
  if (!sdIsList(val.warnings)) {
    throw new BoxSdkError({
      message:
        'Expecting array for "warnings" of type "DocGenJobV2025R0FailuresField"',
    });
  }
  const warnings: readonly string[] = sdIsList(val.warnings)
    ? (val.warnings.map(function (itm: SerializedData): string {
        if (!sdIsString(itm)) {
          throw new BoxSdkError({
            message: 'Expecting string for "DocGenJobV2025R0FailuresField"',
          });
        }
        return itm;
      }) as readonly any[])
    : [];
  return {
    errors: errors,
    warnings: warnings,
  } satisfies DocGenJobV2025R0FailuresField;
}
export function serializeDocGenJobV2025R0(
  val: DocGenJobV2025R0,
): SerializedData {
  const base: any = serializeDocGenJobBaseV2025R0(val);
  if (!sdIsMap(base)) {
    throw new BoxSdkError({
      message: 'Expecting a map for "DocGenJobV2025R0"',
    });
  }
  return {
    ...base,
    ...{
      ['batch']: serializeDocGenBatchBaseV2025R0(val.batch),
      ['template_file']: serializeFileReferenceV2025R0(val.templateFile),
      ['template_file_version']: serializeFileVersionBaseV2025R0(
        val.templateFileVersion,
      ),
      ['output_file']:
        val.outputFile == void 0
          ? val.outputFile
          : serializeFileReferenceV2025R0(val.outputFile),
      ['output_file_version']:
        val.outputFileVersion == void 0
          ? val.outputFileVersion
          : serializeFileVersionBaseV2025R0(val.outputFileVersion),
      ['status']: serializeDocGenJobV2025R0StatusField(val.status),
      ['output_type']: val.outputType,
      ['failures']:
        val.failures == void 0
          ? val.failures
          : serializeDocGenJobV2025R0FailuresField(val.failures),
    },
  };
}
export function deserializeDocGenJobV2025R0(
  val: SerializedData,
): DocGenJobV2025R0 {
  if (!sdIsMap(val)) {
    throw new BoxSdkError({
      message: 'Expecting a map for "DocGenJobV2025R0"',
    });
  }
  if (val.batch == void 0) {
    throw new BoxSdkError({
      message: 'Expecting "batch" of type "DocGenJobV2025R0" to be defined',
    });
  }
  const batch: DocGenBatchBaseV2025R0 = deserializeDocGenBatchBaseV2025R0(
    val.batch,
  );
  if (val.template_file == void 0) {
    throw new BoxSdkError({
      message:
        'Expecting "template_file" of type "DocGenJobV2025R0" to be defined',
    });
  }
  const templateFile: FileReferenceV2025R0 = deserializeFileReferenceV2025R0(
    val.template_file,
  );
  if (val.template_file_version == void 0) {
    throw new BoxSdkError({
      message:
        'Expecting "template_file_version" of type "DocGenJobV2025R0" to be defined',
    });
  }
  const templateFileVersion: FileVersionBaseV2025R0 =
    deserializeFileVersionBaseV2025R0(val.template_file_version);
  const outputFile: FileReferenceV2025R0 | undefined =
    val.output_file == void 0
      ? void 0
      : deserializeFileReferenceV2025R0(val.output_file);
  const outputFileVersion: FileVersionBaseV2025R0 | undefined =
    val.output_file_version == void 0
      ? void 0
      : deserializeFileVersionBaseV2025R0(val.output_file_version);
  if (val.status == void 0) {
    throw new BoxSdkError({
      message: 'Expecting "status" of type "DocGenJobV2025R0" to be defined',
    });
  }
  const status: DocGenJobV2025R0StatusField =
    deserializeDocGenJobV2025R0StatusField(val.status);
  if (val.output_type == void 0) {
    throw new BoxSdkError({
      message:
        'Expecting "output_type" of type "DocGenJobV2025R0" to be defined',
    });
  }
  if (!sdIsString(val.output_type)) {
    throw new BoxSdkError({
      message: 'Expecting string for "output_type" of type "DocGenJobV2025R0"',
    });
  }
  const outputType: string = val.output_type;
  const failures: undefined | DocGenJobV2025R0FailuresField =
    val.failures == void 0
      ? void 0
      : deserializeDocGenJobV2025R0FailuresField(val.failures);
  if (val.id == void 0) {
    throw new BoxSdkError({
      message: 'Expecting "id" of type "DocGenJobV2025R0" to be defined',
    });
  }
  if (!sdIsString(val.id)) {
    throw new BoxSdkError({
      message: 'Expecting string for "id" of type "DocGenJobV2025R0"',
    });
  }
  const id: string = val.id;
  if (val.type == void 0) {
    throw new BoxSdkError({
      message: 'Expecting "type" of type "DocGenJobV2025R0" to be defined',
    });
  }
  const type: DocGenJobBaseV2025R0TypeField =
    deserializeDocGenJobBaseV2025R0TypeField(val.type);
  return {
    batch: batch,
    templateFile: templateFile,
    templateFileVersion: templateFileVersion,
    outputFile: outputFile,
    outputFileVersion: outputFileVersion,
    status: status,
    outputType: outputType,
    failures: failures,
    id: id,
    type: type,
  } satisfies DocGenJobV2025R0;
}
