/*
 * Copyright 2013-present Facebook, Inc.
 *
 * 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.facebook.buck.event;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonValue;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableMap;

import java.util.Map;

import javax.annotation.Nullable;

/**
 * Json format for Chrome Trace events that can be viewed in chrome://tracing.
 * https://code.google.com/p/trace-viewer/wiki/TraceEventFormat
 */
@JsonInclude(Include.NON_NULL)
public class ChromeTraceEvent {
  public enum Phase {
    BEGIN("B"),
    END("E"),
    IMMEDIATE("I"),
    COUNTER("C"),
    ASYNC_START("S"),
    ASYNC_FINISH("F"),
    OBJECT_SNAPSHOT("O"),
    OBJECT_NEW("N"),
    OBJECT_DELETE("D"),
    METADATA("M");

    private final String phase;

    Phase(String phase) {
      this.phase = phase;
    }

    @JsonValue
    String getPhase() {
      return phase;
    }
  }

  private final String category;
  private final String name;
  private final Phase phase;
  private final long processId;
  private final long threadId;
  private final long microTime;
  @Nullable
  private final ImmutableMap<String, String> args;

  public ChromeTraceEvent(@JsonProperty("cat") String category,
                          @JsonProperty("name") String name,
                          @JsonProperty("ph") Phase phase,
                          @JsonProperty("pid") long processId,
                          @JsonProperty("tid") long threadId,
                          @JsonProperty("ts") long microTime,
                          @JsonProperty("args") Map<String, String> args) {
    this.category = Preconditions.checkNotNull(category);
    this.name = Preconditions.checkNotNull(name);
    this.phase = Preconditions.checkNotNull(phase);
    this.processId = processId;
    this.threadId = threadId;
    this.microTime = microTime;
    this.args = ImmutableMap.copyOf(args);
  }

  @JsonProperty("name")
  public String getName() {
    return name;
  }

  @JsonProperty("ph")
  public Phase getPhase() {
    return phase;
  }

  @JsonProperty("pid")
  public long getProcessId() {
    return processId;
  }

  @JsonProperty("tid")
  public long getThreadId() {
    return threadId;
  }

  @JsonProperty("ts")
  public long getMicroTime() {
    return microTime;
  }

  @JsonProperty("args")
  public Map<String, String> getArgs() {
    return args;
  }

  @JsonProperty("cat")
  public String getCategory() {
    return category;
  }
}
