interface InsightBase {
    /**
     * Insight title
     * example: "User Count"
     */
    title: string;
    /**
     * Event icon (emoji)
     * must be a single emoji
     * example: "👨"
     */
    icon?: string;
}
/**
 * Options for publishing LogSnag insight
 */
interface InsightTrackOptions extends InsightBase {
    /**
     * Insight value
     * example: 100
     */
    value: string | boolean | number;
}
interface InsightIncrementOptions extends InsightBase {
    /**
     * Insight value
     * example: 1
     */
    value: number;
}

type TagKey = Lowercase<string>;
/** Tag Type **/
type Tags = Record<TagKey, string | number | boolean>;
type Parser = 'markdown' | 'text';
/**
 * Options for publishing LogSnag events
 */
interface TrackOptions {
    /**
     * Channel name
     * example: "waitlist"
     */
    channel: string;
    /**
     * Event name
     * example: "User Joined"
     */
    event: string;
    /**
     * Event description
     * example: "joe@example.com joined waitlist"
     */
    description?: string;
    /**
     * User ID
     * example: "user-123"
     */
    user_id?: string;
    /**
     * Event icon (emoji)
     * must be a single emoji
     * example: "🎉"
     */
    icon?: string;
    /**
     * Event tags
     * example: { username: "mattie" }
     */
    tags?: Tags;
    /**
     * Send push notification
     */
    notify?: boolean;
    /**
     * Parser for description
     */
    parser?: Parser;
    /**
     * Event timestamp
     */
    timestamp?: number | Date;
}

/** Properties Type **/
type IdentifyProperties = Record<TagKey, string | number | boolean>;
/**
 * Options for publishing LogSnag identify
 */
interface IdentifyOptions {
    /**
     * User ID
     * example: "user-123"
     */
    user_id: string;
    /**
     * User properties
     * example: { username: "mattie" }
     */
    properties: IdentifyProperties;
}

/** Properties Type **/
type GroupProperties = Record<TagKey, string | number | boolean>;
interface GroupWithUserOptions {
    /**
     * Group ID
     * example: "group_123"
     */
    group_id: string;
    /**
     * User ID
     * example: "user-123"
     */
    user_id: string;
}
interface GroupWithPropertiesOptions {
    /**
     * Group ID
     * example: "group_123"
     */
    group_id: string;
    /**
     * User ID
     * example: "user-123"
     */
    user_id: string | undefined;
    /**
     * Group properties
     * example: { username: "mattie" }
     */
    properties: GroupProperties;
}
/**
 * Options for publishing LogSnag group
 */
type GroupOptions = GroupWithUserOptions | GroupWithPropertiesOptions;

/**
 * LogSnag Client
 */
declare class LogSnag {
    private readonly token;
    private readonly project;
    private disabled;
    /**
     * Construct a new LogSnag instance
     * @param token LogSnag API token
     * @param project LogSnag project name
     * @param disableTracking Disable tracking
     * for more information, see: docs.logsnag.com
     */
    constructor({ token, project, disableTracking }: {
        token: string;
        project: string;
        disableTracking?: boolean;
    });
    /**
     * Disable tracking for this instance
     * (this is useful for development)
     */
    disableTracking(): void;
    /**
     * Enable tracking for this instance
     * (this is useful for development)
     */
    enableTracking(): void;
    /**
     * Check if tracking is disabled
     */
    isTrackingDisabled(): boolean;
    /**
     * Get project name
     * @returns project name
     */
    getProject(): string;
    /**
     * Creates authorization header
     * @returns Authorization header value
     */
    protected createAuthorizationHeader(): string;
    /**
     * Creates headers for requests
     * @private
     */
    private createHeaders;
    /**
     * Get insight methods
     */
    get insight(): {
        track: any;
        increment: any;
    };
    /**
     * Publish a new event to LogSnag
     * @param options
     * @returns true when successfully published
     */
    track(options: TrackOptions): Promise<boolean>;
    /**
     * Identify a user
     * @param options
     * @returns true when successfully published
     */
    identify(options: IdentifyOptions): Promise<boolean>;
    /**
     * Group a user or update group properties
     * @param options
     * @returns true when successfully published
     */
    group(options: GroupOptions): Promise<boolean>;
    /**
     * Publish a new insight to LogSnag
     * @param options
     * @returns true when successfully published
     */
    protected insightTrack(options: InsightTrackOptions): Promise<boolean>;
    /**
     * Increment an insight value
     * @param options
     * @returns true when successfully published
     */
    protected insightIncrement(options: InsightIncrementOptions): Promise<boolean>;
}

export { LogSnag };
