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

type GlobalStorage = {
  totalFileSystemCapacity: number;
  totalReservedSpace: number;
  totalOzoneCapacity: number;
  totalOzoneUsedSpace: number;
  totalOzoneFreeSpace: number;
  totalOzoneCommittedSpace: number;
  totalMinimumFreeSpace: number;
};

type GlobalNamespace = {
  totalUsedSpace: number;
  totalKeys: number;
};

type UsedSpaceBreakdown = {
  openKeyBytes: OpenKeyBytesInfo;
  finalizedKeyBytes: number;
};

type OpenKeyBytesInfo = {
  totalOpenKeyBytes: number;
  openKeyAndFileBytes: number;
  multipartOpenKeyBytes: number;
};

type DNPendingDeleteStat = {
  hostName: string;
  datanodeUuid: string;
  pendingBlockSize: number;
}

export type DataNodeUsage = {
  datanodeUuid: string;
  hostName: string;
  capacity: number;
  used: number;
  remaining: number;
  committed: number;
  minimumFreeSpace: number;
  reserved: number;
};

export type UtilizationResponse = {
  globalStorage: GlobalStorage;
  globalNamespace: GlobalNamespace;
  usedSpaceBreakdown: UsedSpaceBreakdown;
  dataNodeUsage: DataNodeUsage[];
};

export type DNPendingDeletion = {
  status: "NOT_STARTED" | "IN_PROGRESS" | "FINISHED" | "FAILED";
  totalPendingDeletionSize: number | null;
  pendingDeletionPerDataNode: DNPendingDeleteStat[] | null;
  totalNodesQueried: number | null;
  totalNodeQueriesFailed: number | null;
}

export type OMPendingDeletion = {
  totalSize: number;
  pendingDirectorySize: number;
  pendingKeySize: number;
}

export type SCMPendingDeletion = {
  totalBlocksize: number;
  totalReplicatedBlockSize: number;
  totalBlocksCount: number;
}

export type Segment = {
  value: number;
  color: string;
  label: string | React.ReactNode;
};
