import { Alignment, Style } from "@monstermann/tables";
import { Task, TaskResultCompleted } from "tinybench";

//#region src/types.d.ts
type TaskWithResult = Task & {
  result: TaskResultCompleted;
};
type CountMethod = "none" | "shortest" | "highest" | "lowest" | "mean" | "thousands" | "millions" | "billions";
type DurationMethod = "shortest" | "highest" | "lowest" | "mean" | "nanoseconds" | "microseconds" | "milliseconds" | "seconds";
type SummaryMethod = "x" | "%";
type SortMethod = false | "asc" | "desc" | ((tasks: TaskWithResult[]) => TaskWithResult[]);
type DefaultColumn = "name" | "summary" | "ops" | "time" | "margin" | "samples";
type ColumnContext = {
  fastestTask: TaskWithResult;
  locales: Intl.LocalesArgument;
  slowestTask: TaskWithResult;
  task: TaskWithResult;
  tasks: TaskWithResult[];
  formatCount: (method: CountMethod, value: number, values: number[]) => string;
  formatDuration: (method: DurationMethod, value: number, values: number[]) => string;
  formatNumber: (value: number) => string;
};
type ColumnOptions = {
  header: string;
  headerAlignment: Alignment;
  headerStyle: Style[];
  rowAlignment: Alignment;
  rowStyle: Style[];
};
type Column = ColumnOptions & {
  content: (ctx: ColumnContext) => string;
};
type Columns<T extends string> = Record<T, Column>;
type NameOptions = Partial<ColumnOptions>;
type SummaryOptions = Partial<ColumnOptions & {
  fastestTitle: string;
  method: SummaryMethod;
}>;
type OpsOptions = Partial<ColumnOptions & {
  method: CountMethod;
}>;
type TimeOptions = Partial<ColumnOptions & {
  method: DurationMethod;
}>;
type MarginOptions = Partial<ColumnOptions>;
type SamplesOptions = Partial<ColumnOptions & {
  method: CountMethod;
}>;
//#endregion
export { Column, ColumnContext, ColumnOptions, Columns, CountMethod, DefaultColumn, DurationMethod, MarginOptions, NameOptions, OpsOptions, SamplesOptions, SortMethod, SummaryMethod, SummaryOptions, TaskWithResult, TimeOptions };