/**
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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 { Value } from '@/types/dashboard';

export interface State {
  instanceResponseTime: { ResponseTime: number[]; };
  instanceSLA: { SLA: number[]; };
  instanceThroughput: { Throughput: number[]; };
  instanceCPU: { cpu: number[]; };
  instanceGC: { oldGC: number[], youngGC: number[] };
  instanceGCCount: { oldGC: number[], youngGC: number[] };
  instanceHeap: { Value: number[], Free: number[], Hint: string };
  instanceNonheap: { Value: number[], Free: number[], Hint: string };
  instanceClrHeap: { Value: number[] };
  instanceClrCPU: { cpu: number[]; };
  instanceClrGC: { clrGCGen0: number[], clrGCGen1: number[], clrGCGen2: number[]};
}

export const initState: State = {
  instanceResponseTime: { ResponseTime: [] },
  instanceSLA: { SLA: [] },
  instanceThroughput: { Throughput: [] },
  instanceCPU: { cpu: [] },
  instanceGC: { oldGC: [], youngGC: [] },
  instanceGCCount: { oldGC: [], youngGC: [] },
  instanceHeap: { Value: [], Free: [], Hint: '' },
  instanceNonheap: { Value: [], Free: [], Hint: '' },
  instanceClrHeap: { Value: [] },
  instanceClrCPU: { cpu: [] },
  instanceClrGC: { clrGCGen0: [], clrGCGen1: [], clrGCGen2: [] },
};
export const SetInstance = (state: State, params: any) => {
  if (params && params.instanceResponseTime) {
    state.instanceResponseTime.ResponseTime = params.instanceResponseTime.values.map((i: Value) => i.value);
  }
  if (params && params.instanceThroughput) {
    state.instanceThroughput.Throughput = params.instanceThroughput.values.map((i: Value) => i.value);
  }
  if (params && params.instanceSLA) {
    state.instanceSLA.SLA = params.instanceSLA.values.map((i: Value) => i.value / 100);
  }
  if (params && params.instanceCPU) {
    state.instanceCPU.cpu = params.instanceCPU.values.map((i: Value) => i.value);
  }
  if (params && params.oldGCTime && params.youngGCTime) {
    state.instanceGC.oldGC = params.oldGCTime.values.map((i: Value) => i.value);
    state.instanceGC.youngGC = params.youngGCTime.values.map((i: Value) => i.value);
  }
  if (params && params.oldGCCount && params.youngGCCount) {
    state.instanceGCCount.oldGC = params.oldGCCount.values.map((i: Value) => i.value);
    state.instanceGCCount.youngGC = params.youngGCCount.values.map((i: Value) => i.value);
  }
  if (params && params.heap && params.maxHeap) {
    state.instanceHeap.Value = params.heap.values.map((i: Value) => (i.value / 1048576).toFixed(2));
    state.instanceHeap.Free = params.maxHeap.values
      .map((i: Value, index: number) =>
        i.value > -1 ? ((i.value / 1048576) - state.instanceHeap.Value[index]).toFixed(2) : 0);
    state.instanceHeap.Hint = Math.max.apply(Math, params.maxHeap.values) === -1 ? 'Max Heap Unlimited' : '';
  }
  if (params && params.nonheap && params.maxNonHeap) {
    state.instanceNonheap.Value = params.nonheap.values.map((i: Value) => (i.value / 1048576).toFixed(2));
    state.instanceNonheap.Free = params.maxNonHeap.values
      .map((i: Value, index: number) =>
        i.value > -1 ? ((i.value / 1048576) - state.instanceNonheap.Value[index]).toFixed(2) : 0);
    state.instanceNonheap.Hint = Math.max.apply(Math, params.maxNonHeap.values) === -1 ? 'Max NonHeap Unlimited' : '';
  }
  if (params && params.clrHeap) {
    state.instanceClrHeap.Value = params.clrHeap.values.map((i: Value) => (i.value / 1048576 ).toFixed(2));
  }
  if (params && params.clrCPU) {
    state.instanceClrCPU.cpu = params.clrCPU.values.map((i: Value) => i.value);
  }
  if (params && params.clrGCGen0 && params.clrGCGen1 && params.clrGCGen2) {
    state.instanceClrGC.clrGCGen0 = params.clrGCGen0.values.map((i: Value) => i.value);
    state.instanceClrGC.clrGCGen1 = params.clrGCGen1.values.map((i: Value) => i.value);
    state.instanceClrGC.clrGCGen2 = params.clrGCGen2.values.map((i: Value) => i.value);
  }
};
