<?php

/** @kphp-generate-stub-class */
final class KphpDiv {
  /** @kphp-extern-func-info generate-stub */
  private function __construct();

  /** @kphp-extern-func-info generate-stub */
  function generateTraceCtxForChild(int $div_id, int $trace_flags): tuple(int, int);
  /** @kphp-extern-func-info generate-stub */
  function assignTraceCtx(int $int1, int $int2, ?int $override_div_id): int;
  /** @kphp-extern-func-info generate-stub */
  function getStartTimestamp(): float;
  /** @kphp-extern-func-info generate-stub */
  function getEndTimestamp(): float;
}

/** @kphp-generate-stub-class */
final class KphpSpan {
  /** @kphp-extern-func-info generate-stub */
  private function __construct();

  /** @kphp-extern-func-info generate-stub */
  function addAttributeString(string $key, string $value) ::: void;
  /** @kphp-extern-func-info generate-stub */
  function addAttributeInt(string $key, int $value) ::: void;
  /** @kphp-extern-func-info generate-stub */
  function addAttributeFloat(string $key, float $value) ::: void;
  /** @kphp-extern-func-info generate-stub */
  function addAttributeBool(string $key, bool $value) ::: void;
  /** @kphp-extern-func-info generate-stub */
  function addAttributeEnum(string $key, int $enum_id, int $value) ::: void;

  /** @kphp-extern-func-info generate-stub */
  function addEvent(string $name, ?float $timestamp = null): KphpSpanEvent;
  /** @kphp-extern-func-info generate-stub */
  function addLink(KphpSpan $another) ::: void;

  /** @kphp-extern-func-info generate-stub */
  function updateName(string $title, string $short_desc) ::: void;
  /** @kphp-extern-func-info generate-stub */
  function finish(?float $end_timestamp = null) ::: void;
  /** @kphp-extern-func-info generate-stub */
  function finishWithError(int $error_code, string $error_msg, ?float $end_timestamp = null) ::: void;
  /** @kphp-extern-func-info generate-stub */
  function exclude() ::: void;
}

/** @kphp-generate-stub-class */
final class KphpSpanEvent {
  /** @kphp-extern-func-info generate-stub */
  private function __construct();

  /** @kphp-extern-func-info generate-stub */
  function addAttributeString(string $key, string $value) ::: void;
  /** @kphp-extern-func-info generate-stub */
  function addAttributeInt(string $key, int $value) ::: void;
  /** @kphp-extern-func-info generate-stub */
  function addAttributeFloat(string $key, float $value) ::: void;
  /** @kphp-extern-func-info generate-stub */
  function addAttributeBool(string $key, bool $value) ::: void;
}

/** @kphp-extern-func-info generate-stub */
function kphp_tracing_init(string $root_span_title): KphpDiv;
/** @kphp-extern-func-info generate-stub */
function kphp_tracing_set_level(int $trace_level): void;
/** @kphp-extern-func-info generate-stub */
function kphp_tracing_get_level(): int;

function kphp_tracing_register_on_finish(callable(float $now_timestamp):bool $cb_should_be_flushed);
function kphp_tracing_register_enums_provider(callable():tuple(int, string, string[])[] $cb_custom_enums);
function kphp_tracing_register_rpc_details_provider(callable(@tl\RpcFunction):string $cb_for_typed, callable(mixed):string $cb_for_untyped);

/** @kphp-extern-func-info generate-stub */
function kphp_tracing_start_span(string $title, string $short_desc, float $start_timestamp): KphpSpan;
/** @kphp-extern-func-info generate-stub */
function kphp_tracing_get_root_span(): KphpSpan;
/** @kphp-extern-func-info generate-stub */
function kphp_tracing_get_current_active_span(): KphpSpan;
/** @kphp-extern-func-info generate-stub */
function kphp_tracing_func_enter_branch(int $branch_num) ::: void;
