/**
 * 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 type { Process as SelectorProcess } from "./selector";

export interface EBPFTaskCreationRequest {
  serviceId: string;
  processLabels: string[];
  startTime: number;
  duration: number;
  targetType: string;
}

export interface EBPFTaskList {
  taskId: string;
  serviceName: string;
  serviceId: string;
  serviceInstanceId: string;
  serviceInstanceName: string;
  processId: string;
  processName: string;
  processLabels: string[];
  taskStartTime: number;
  fixedTriggerDuration: number;
  targetType: string;
  createTime: number;
  triggerType: string;
  continuousProfilingCauses: ProfilingCause[];
}

interface ProfilingCause {
  type: string;
  singleValue: {
    threshold: number;
    current: number;
  };
  uri: {
    uriRegex: string;
    uriPath: string;
    threshold: number;
    current: number;
  };
}
export interface Process extends SelectorProcess {
  labels: string[];
}
export interface EBPFProfilingSchedule {
  scheduleId: string;
  taskId: string;
  process: Process;
  endTime: number;
  startTime: number;
}

export type StackElement = {
  id: string;
  originId: string;
  name: string;
  parentId: string;
  symbol: string;
  dumpCount: number;
  stackType: string;
  value: number;
  children?: StackElement[];
  rateOfRoot?: string;
  rateOfParent: string;
};
export type TraceProfilingElement = {
  id: string;
  originId: string;
  name: string;
  parentId: string;
  codeSignature: string;
  count: number;
  stackType: string;
  value: number;
  children?: TraceProfilingElement[];
  rateOfRoot?: string;
  rateOfParent: string;
  duration: number;
  durationChildExcluded: number;
};
export type AnalyzationTrees = {
  id: string;
  parentId: string;
  symbol: string;
  dumpCount: number;
  stackType: string;
  aggregateType: string;
  elements?: StackElement[];
};
export type ProcessNode = {
  id: string;
  name: string;
  serviceId: string;
  serviceName: string;
  serviceInstanceId: string;
  serviceInstanceName: string;
  isReal: boolean;
  x?: number;
  y?: number;
};
export interface NetworkProfilingRequest {
  uriRegex: string;
  when4xx: string;
  when5xx: string;
  minDuration: number;
}
