/*
 * Copyright (C) 2022 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

export class TransferConfig extends Object {
  private _fileSize: number = -1; // uint64_t
  private _atime: number = -1; // uint64_t ns
  private _mtime: number = -1; //  uint64_t ns
  private _options: string = ''; //  string
  private _path: string = '';
  private _optionalName: string = '';
  private _updateIfNew: boolean = false; //bool
  private _compressType: number = CompressType.COMPRESS_NONE; // uint8_t
  private _holdTimestamp: boolean = false; //bool
  private _functionName: string = '';
  private _clientCwd: string = '';
  private _reserve1: string = '';
  private _reserve2: string = '';

  constructor(
    fileSize: number,
    atime: number,
    mtime: number,
    options: string,
    path: string,
    optionalName: string,
    updateIfNew: boolean,
    compressType: number,
    holdTimestamp: boolean,
    functionName: string,
    clientCwd: string,
    reserve1: string,
    reserve2: string
  ) {
    super();
    this._fileSize = fileSize;
    this._atime = atime;
    this._mtime = mtime;
    this._options = options;
    this._path = path;
    this._optionalName = optionalName;
    this._updateIfNew = updateIfNew;
    this._compressType = compressType;
    this._holdTimestamp = holdTimestamp;
    this._functionName = functionName;
    this._clientCwd = clientCwd;
    this._reserve1 = reserve1;
    this._reserve2 = reserve2;
  }

  get fileSize(): number {
    return this._fileSize;
  }

  set fileSize(value: number) {
    this._fileSize = value;
  }

  get atime(): number {
    return this._atime;
  }

  set atime(value: number) {
    this._atime = value;
  }

  get mtime(): number {
    return this._mtime;
  }

  set mtime(value: number) {
    this._mtime = value;
  }

  get options(): string {
    return this._options;
  }

  set options(value: string) {
    this._options = value;
  }

  get path(): string {
    return this._path;
  }

  set path(value: string) {
    this._path = value;
  }

  get optionalName(): string {
    return this._optionalName;
  }

  set optionalName(value: string) {
    this._optionalName = value;
  }

  get updateIfNew(): boolean {
    return this._updateIfNew;
  }

  set updateIfNew(value: boolean) {
    this._updateIfNew = value;
  }

  get compressType(): number {
    return this._compressType;
  }

  set compressType(value: number) {
    this._compressType = value;
  }

  get holdTimestamp(): boolean {
    return this._holdTimestamp;
  }

  set holdTimestamp(value: boolean) {
    this._holdTimestamp = value;
  }

  get functionName(): string {
    return this._functionName;
  }

  set functionName(value: string) {
    this._functionName = value;
  }

  get clientCwd(): string {
    return this._clientCwd;
  }

  set clientCwd(value: string) {
    this._clientCwd = value;
  }

  get reserve1(): string {
    return this._reserve1;
  }

  set reserve1(value: string) {
    this._reserve1 = value;
  }

  get reserve2(): string {
    return this._reserve2;
  }

  set reserve2(value: string) {
    this._reserve2 = value;
  }

  toString(): string {
    return (
      'fileSize: ' +
      this._fileSize +
      ' atime: ' +
      this._atime +
      ' mtime: ' +
      this._mtime +
      ' options: ' +
      this._options +
      ' path: ' +
      this._path +
      ' optionalName: ' +
      this._optionalName +
      ' updateIfNew: ' +
      this._updateIfNew +
      ' compressType: ' +
      this._compressType +
      ' holdTimestamp: ' +
      this._holdTimestamp +
      ' functionName: ' +
      this._functionName +
      ' clientCwd: ' +
      this._clientCwd +
      ' reserve1: ' +
      this._reserve1 +
      ' reserve2: ' +
      this._reserve2
    );
  }
}

enum CompressType {
  COMPRESS_NONE,
  COMPRESS_LZ4,
  COMPRESS_LZ77,
  COMPRESS_LZMA,
  COMPRESS_BROTLI,
}