import { BooleanFlag } from "@clarity-types/data";
import { Time } from "./core";
import { Event, Target } from "./data";

/* Enum */

export const enum BrowsingContext {
    Self = 0,
    Blank = 1,
    Parent = 2,
    Top = 3
}

export const enum ClickSource {
    Undefined = 0,
    FirstParty = 1,
    ThirdParty = 2,
    Eval = 3,
    Unknown = 4
}

export const enum Setting {
    LookAhead = 500, // 500ms
    InputLookAhead = 750, // 750ms
    Distance = 20, // 20 pixels
    ScrollInterval = 50, // 25 milliseconds
    PointerInterval = 25, // 25 milliseconds
    Throttle = 25, // 25 milliseconds
    TimelineSpan = 2 * Time.Second, // 2 seconds
}

export const enum Clipboard {
    Cut = 0,
    Copy = 1,
    Paste = 2
}

/* Helper Interfaces */
export interface PointerState {
    time: number;
    event: number;
    data: PointerData;
}

export interface ClickState {
    time: number;
    event: number;
    data: ClickData;
}

export interface ClipboardState {
    time: number;
    event: number;
    data: ClipboardData;
}

export interface ScrollState {
    time: number;
    event: number;
    data: ScrollData;
}

export interface SubmitState {
    time: number;
    event: number;
    data: SubmitData;
}

export interface ChangeState {
    time: number;
    event: number;
    data: ChangeData;
}

export interface InputState {
    time: number;
    event: number;
    data: InputData;
}

export interface TimelineState {
    time: number;
    event: number;
    data: TimelineData;
}

/* Event Data */
export interface TimelineData {
    type: Event;
    hash: string;
    x: number;
    y: number;
    reaction: number;
    context: number;
}

export interface ChangeData {
    target: Target;
    type: string;
    value: string;
    checksum: string;
}

export interface InputData {
    target: Target;
    value: string;
    type?: string;
    trust: BooleanFlag;
}

export interface SubmitData {
    target: Target;
}

export interface PointerData {
    target: Target;
    x: number;
    y: number;
    id?: number;
    isPrimary?: boolean;
}

export interface ClickData {
    target: Target;
    x: number;
    y: number;
    eX: number;
    eY: number;
    button: number;
    reaction: number;
    context: BrowsingContext;
    text: string;
    link: string;
    hash: string;
    trust: number;
    isFullText: BooleanFlag;
    w: number;
    h: number;
    tag: string;
    class: string;
    id: string;
    source: ClickSource;
}

export interface TextInfo {
    text: string;
    isFullText: BooleanFlag;
}

export interface ClipboardData {
    target: Target;
    action: Clipboard;
}

export interface ResizeData {
    width: number;
    height: number;
}

export interface ScrollData {
    target: Target;
    x: number;
    y: number;
    top: Node | string;
    bottom: Node | string;
    trust: BooleanFlag;
}

export interface SelectionData {
    start: Target;
    startOffset: number;
    end: Target;
    endOffset: number;
}

export interface UnloadData {
    name: string;
    persisted: BooleanFlag;
}

export interface VisibilityData {
    visible: BooleanFlag;
}

export interface FocusData {
    focused: BooleanFlag;
}
