// Copyright 2024 The Bazel Authors. All rights reserved.
//
// 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.
package com.google.devtools.build.lib.profiler;

import com.google.devtools.build.lib.skybridge.SkybridgeInterface;
import javax.annotation.Nullable;

/**
 * Describes counter series to be logged into profile.
 *
 * @param laneName The lane name for the counter series. Series with the same lane name should be
 *     stacked when displaying.
 * @param seriesName The name for the counter series.
 * @param color The color for the counter series. If {@code null}, the profile viewer will pick a
 *     color automatically.
 */
@SkybridgeInterface
public record CounterSeriesTask(String laneName, String seriesName, @Nullable Color color) {
  /** The revered color for rendering the bar chart. */
  public enum Color {
    // Pick acceptable counter colors manually, unfortunately we have to pick from these
    // weird reserved names from
    // https://github.com/catapult-project/catapult/blob/master/tracing/tracing/base/color_scheme.html
    THREAD_STATE_UNINTERRUPTIBLE("thread_state_uninterruptible"),
    THREAD_STATE_IOWAIT("thread_state_iowait"),
    THREAD_STATE_RUNNING("thread_state_running"),
    THREAD_STATE_RUNNABLE("thread_state_runnable"),
    THREAD_STATE_SLEEPING("thread_state_sleeping"),
    THREAD_STATE_UNKNOWN("thread_state_unknown"),
    BACKGROUND_MEMORY_DUMP("background_memory_dump"),
    LIGHT_MEMORY_DUMP("light_memory_dump"),
    DETAILED_MEMORY_DUMP("detailed_memory_dump"),
    VSYNC_HIGHLIGHT_COLOR("vsync_highlight_color"),
    GENERIC_WORK("generic_work"),
    GOOD("good"),
    BAD("bad"),
    TERRIBLE("terrible"),
    BLACK("black"),
    GREY("grey"),
    WHITE("white"),
    YELLOW("yellow"),
    OLIVE("olive"),
    RAIL_RESPONSE("rail_response"),
    RAIL_ANIMATION("rail_animation"),
    RAIL_IDLE("rail_idle"),
    RAIL_LOAD("rail_load"),
    STARTUP("startup"),
    HEAP_DUMP_STACK_FRAME("heap_dump_stack_frame"),
    HEAP_DUMP_OBJECT_TYPE("heap_dump_object_type"),
    HEAP_DUMP_CHILD_NODE_ARROW("heap_dump_child_node_arrow"),
    CQ_BUILD_RUNNING("cq_build_running"),
    CQ_BUILD_PASSED("cq_build_passed"),
    CQ_BUILD_FAILED("cq_build_failed"),
    CQ_BUILD_ABANDONED("cq_build_abandoned"),
    CQ_BUILD_ATTEMPT_RUNNIG("cq_build_attempt_runnig"),
    CQ_BUILD_ATTEMPT_PASSED("cq_build_attempt_passed"),
    CQ_BUILD_ATTEMPT_FAILED("cq_build_attempt_failed");

    private final String value;

    private Color(String value) {
      this.value = value;
    }

    public String value() {
      return value;
    }
  }
}
