/*
 * 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.
 */

import { Utils } from '../component/trace/base/Utils';
import { ChartStruct } from '../bean/FrameChartStruct';

export class NativeHookStatistics {
  eventId: number = 0;
  eventType: string = '';
  subType: string = '';
  subTypeId: number = 0;
  heapSize: number = 0;
  addr: string = '';
  startTs: number = 0;
  endTs: number = 0;
  sumHeapSize: number = 0;
  max: number = 0;
  count: number = 0;
  tid: number = 0;
  threadName: string = '';
  isSelected: boolean = false;
}

export class NativeHookMalloc {
  eventType: string = '';
  subType: string = '';
  subTypeId: number = 0;
  heapSize: number = 0;
  allocByte: number = 0;
  allocCount: number = 0;
  freeByte: number = 0;
  freeCount: number = 0;
  max: number = 0;
}

export class NativeEventHeap {
  eventType: string = '';
  sumHeapSize: number = 0;
}

export class NativeHookProcess {
  ipid: number = 0;
  pid: number = 0;
  name: String = '';
}

export class NativeHookStatisticsTableData {
  memoryTap: string = '';
  eventType: string = '';
  existing: number = 0;
  existingString: string = '';
  freeByteString: string = '';
  allocCount: number = 0;
  freeCount: number = 0;
  freeByte: number = 0;
  totalBytes: number = 0;
  totalBytesString: string = '';
  maxStr: string = '';
  max: number = 0;
  totalCount: number = 0;
  existingValue: Array<number> = [];
}

export class NativeMemory {
  index: number = 0;
  eventId: number = 0;
  threadId: number = 0;
  threadName: string = '';
  eventType: string = '';
  subType: string = '';
  startTs: number = 0;
  endTs: number = 0;
  timestamp: string = '';
  heapSize: number = 0;
  heapSizeUnit: string = '';
  symbol: string = '';
  library: string = '';
  isSelected: boolean = false;
  state: string = '';
  addr: string = '';
}

export class NativeHookSamplerInfo {
  current: string = '';
  currentSize: number = 0;
  startTs: number = 0;
  heapSize: number = 0;
  snapshot: string = '';
  growth: string = '';
  total: number = 0;
  totalGrowth: string = '';
  existing: number = 0;
  children: Array<NativeHookSamplerInfo> = [];
  tempList: Array<NativeHookSamplerInfo> = [];
  timestamp: string = '';
  eventId: number = -1;
  threadId: number = 0;
  threadName: string = '';

  merageObj(merageObj: NativeHookSamplerInfo): void {
    this.currentSize += merageObj.currentSize;
    this.heapSize += merageObj.heapSize;
    this.existing += merageObj.existing;
    this.total += merageObj.total;
    this.growth = Utils.getByteWithUnit(this.heapSize);
    this.current = Utils.getByteWithUnit(this.currentSize);
    this.totalGrowth = Utils.getByteWithUnit(this.total);
  }
}

export class NativeHookSampleQueryInfo {
  eventId: number = -1;
  current: number = 0;
  eventType: string = '';
  subType: string = '';
  subTypeId: number = 0;
  growth: number = 0;
  existing: number = 0;
  addr: string = '';
  startTs: number = 0;
  endTs: number = 0;
  total: number = 0;
  threadId: number = 0;
  threadName: string = '';
  children: Array<NativeHookSamplerInfo> = [];
}

export class NativeHookCallInfo extends ChartStruct {
  pid: string | undefined;
  symbolId: number = 0;
  count: number = 0;
  countValue: string = '';
  countPercent: string = '';
  type: number = 0;
  heapSize: number = 0;
  heapPercent: string = '';
  heapSizeStr: string = '';
  eventId: number = 0;
  threadId: number = 0;
  threadName: string = '';
  isSelected: boolean = false;
}

export class NativeEvent {
  startTime: number = 0;
  heapSize: number = 0;
  eventType: string = '';
}

export class NativeMemoryExpression {
  includeLib: Map<string, string[]> = new Map<string, string[]>();
  abandonLib: Map<string, string[]> = new Map<string, string[]>();
}

export class FilterByAnalysis {
  symbolId?: number;
  symbolName?: string;
  libId?: number;
  libName?: string;
  tid?: number;
  tName?: string;
  type?: string;
  typeId?: number;

  constructor(
    typeId: number | undefined,
    type: string | undefined,
    tName: string | undefined,
    tid: number | undefined,
    libId: number | undefined,
    libName: string | undefined,
    symbolId: number | undefined,
    symbolName: string | undefined
  ) {
    this.typeId = typeId;
    this.libId = libId || -1;
    this.libName = libName;
    this.tid = tid;
    this.tName = tName;
    this.symbolId = symbolId;
    this.symbolName = symbolName;
    this.type = type;
  }
}