/// Auto-generated with ScanbotSDKCodegenV3. Modifications will be overwritten.
/// Generated from rtu-ui-v2/schemas/creditcard/CreditCardScannerUIResult.yaml

import { CreditCardScanningStatus } from '../../credit_card/CreditCardTypes';
import { GenericDocument } from '../../documents/GenericDocument';
import { ToJsonConfiguration } from '../../utils/json/JsonSerializationTypes';
import { DeepPartial, PartiallyConstructible } from '../../utils/utils';

/**
Configuration of the credit card scanner RTU UI result.
*/
export class CreditCardScannerUiResult extends PartiallyConstructible {
  /**
    The status of the credit card recognition step.
    */
  public readonly recognitionStatus: CreditCardScanningStatus;
  /**
    Generic document containing credit card data. Not present, if status is FAIL.
    */
  public readonly creditCard: GenericDocument | null;

  /** @param source {@displayType `DeepPartial<CreditCardScannerUiResult>`} */
  public constructor(source: DeepPartial<CreditCardScannerUiResult> = {}) {
    super();
    if (source.recognitionStatus !== undefined) {
      this.recognitionStatus = source.recognitionStatus;
    } else {
      throw new Error('recognitionStatus must be present in constructor argument');
    }
    if (source.creditCard !== undefined) {
      this.creditCard = source.creditCard != null ? new GenericDocument(source.creditCard) : null;
    } else {
      throw new Error('creditCard must be present in constructor argument');
    }
  }

  public async serialize(
    config: ToJsonConfiguration = new ToJsonConfiguration()
  ): Promise<DeepPartial<CreditCardScannerUiResult>> {
    return {
      recognitionStatus: this.recognitionStatus,
      creditCard: this.creditCard != null ? await this.creditCard.serialize(config) : null,
    };
  }

  private _released: Boolean = false;

  public release() {
    if (this._released) {
      return;
    }
    {
      if (this.creditCard != null) {
        this.creditCard.release();
      }
    }
    this._released = true;
  }

  public async encodeImages(): Promise<void> {
    if (this.creditCard != null) {
      await this.creditCard.encodeImages();
    }
  }
}
