
/**
 * A color used to encode color data for nodes and edges
 * can be a number (like '1') representing one of the (currently 6) supported colors.
 * or can be a custom color using the hex format '#FFFFFFF'.
 */
export type CanvasColor = string;

/** The overall canvas file's JSON */
export interface CanvasData {
    nodes: AllCanvasNodeData[];
    edges: CanvasEdgeData[];

    /** Support arbitrary keys for forward compatibility */
    [key: string]: any;
}

/** A node */
export interface CanvasNodeData {
    /** The unique ID for this node */
    id: string;
    // The positional data
    x: number;
    y: number;
    width: number;
    height: number;
    /** The color of this node */
    color?: CanvasColor;

    // Support arbitrary keys for forward compatibility
    [key: string]: any;
}

export type AllCanvasNodeData = CanvasFileData | CanvasTextData | CanvasLinkData | CanvasGroupData;

/** A node that is a file, where the file is located somewhere in the vault. */
export interface CanvasFileData extends CanvasNodeData {
    type: 'file';
    file: string;
    /** An optional subpath which links to a heading or a block. Always starts with a `#`. */
    subpath?: string;
}

/** A node that is plaintext. */
export interface CanvasTextData extends CanvasNodeData {
    type: 'text';
    text: string;
}

/** A node that is an external resource. */
export interface CanvasLinkData extends CanvasNodeData {
    type: 'link';
    url: string;
}

/** The background image rendering style */
export type BackgroundStyle = 'cover' | 'ratio' | 'repeat';

/** A node that represents a group. */
export interface CanvasGroupData extends CanvasNodeData {
    type: 'group';
    /** Optional label to display on top of the group. */
    label?: string;
    /** Optional background image, stores the path to the image file in the vault. */
    background?: string;
    /** Optional background image rendering style; defaults to 'cover'. */
    backgroundStyle?: BackgroundStyle;
}

/** The side of the node that a connection is connected to */
export type NodeSide = 'top' | 'right' | 'bottom' | 'left';

/** What to display at the end of an edge */
export type EdgeEnd = 'none' | 'arrow';

/** An edge */
export interface CanvasEdgeData {
    /** The unique ID for this edge */
    id: string;
    /** The node ID and side where this edge starts */
    fromNode: string;
    fromSide?: NodeSide;
    /** The starting edge end; defaults to 'none' */
    fromEnd?: EdgeEnd;
    /** The node ID and side where this edge ends */
    toNode: string;
    toSide?: NodeSide;
    /** The ending edge end; defaults to 'arrow' */
    toEnd?: EdgeEnd;
    /** The color of this edge */
    color?: CanvasColor;
    /** The text label of this edge, if available */
    label?: string;

    // Support arbitrary keys for forward compatibility
    [key: string]: any;
}
