import { DefineComponent } from 'vue';
import { Directive } from 'vue';
import { Plugin as Plugin_2 } from 'vue';

export declare interface Address {
    /**
     * Address first line, usually composed by street number and/or route
     */
    street_address?: string;
    /**
     * Address second line, usually composed by apartment number and/or room
     */
    extended_address?: string;
    /**
     * Address state, abbreviated according to ISO 3166-1 alpha-2
     */
    state?: string;
    /**
     * Address postal code
     */
    postal_code?: string;
    /**
     * Address city
     */
    city?: string;
    /**
     * Address country, abbreviated according to ISO 3166-1 alpha-2
     */
    country?: string;
    /**
     * Address latitude
     */
    lat?: number;
    /**
     * Address longitude
     */
    long?: number;
    /**
     * Google Place id
     */
    place_id?: string;
}

export declare interface AddressOption {
    /**
     * Google Place id
     */
    id: string;
    /**
     * Google Place Prediction description
     */
    name: string;
    /**
     * Address object
     */
    address?: Address;
}

declare const _default: Plugin_2;
export default _default;

declare interface DialogsPluginOptions {
    mountNodeClass?: string;
    mountNodeId?: string;
}

/**
 * Retrieve an item from localStorage, previously saved by `setPersistentItem`.
 * @param {string} name The storage key name, often a component name
 * @param {object} [options] - an optional options object
 * @param {boolean} [options.global] - does not add url to the key when true
 * @returns {any | undefined}
 */
declare function getPersistentItem(name: any, options?: {
    global?: boolean;
}): any;

export declare interface I18nPlugin {
    locale: string;
    t: (key: string, value: string) => string;
}

export declare interface LinkTokenResponse {
    link_token: string;
    expiration: string;
    request_id: string;
}

declare interface MenusPluginOptions {
    mountNodeClass?: string;
    mountNodeId?: string;
}

declare interface ModalsPluginOptions {
    mountNodeClass?: string;
    mountNodeId?: string;
}

export declare function overridePersistentStorage(s: any): void;

export declare const persistentStorage: {
    get: typeof getPersistentItem;
    set: typeof setPersistentItem;
    remove: typeof removePersistentItem;
};

/**
 * Remove an item from localStorage, previously saved by `setPersistentItem`.
 * @param {string} name The storage key name, often a component name
 * @param {object} [options] - an optional options object
 * @param {boolean} [options.global] - does not add url to the key when true
 */
declare function removePersistentItem(name: any, options?: {
    global?: boolean;
}): void;

/**
 * Persist an item to localStorage, unique to each url pathname unless [options.global] is set to true
 *
 * If global is set to false (the default):
 *   name: 'foo'
 *   data: { a: 'a' }
 *
 *   localStorage key: 'll-foo-/c/the-leaf-shop/customers/'
 *   localStorage value: { a: 'a' }
 *
 * If global is set to true:
 *   name: 'bar'
 *   data: { b: 'b' }
 *
 *   localStorage key: 'll-bar'
 *   localStorage value: { b: 'b' }
 *
 * @param {string} name - the storage key name, often a component name
 * @param {object} data - the data to persist
 * @param {object} [options] - an optional options object
 * @param {boolean} [options.global] - does not add url to the key when true
 */
declare function setPersistentItem(name: any, data: any, options?: {
    global?: boolean;
}): void;

export declare type SpacingDensities = `${SpacingDensity}`;

/**
 * For controlling properties like "padding" and "margin" within and between components.
 */
export declare enum SpacingDensity {
    Compact = "compact",
    Comfortable = "comfortable"
}

export declare enum StashImageProvider {
    Static = "static",
    Cloudinary = "cloudinary"
}

/**
 * Image
 */
export declare type StashImageProviders = `${StashImageProvider}`;

export declare interface StashOptionImages {
    provider: StashImageProviders;
}

export declare interface StashPluginOptions {
    i18n?: I18nPlugin;
    storage?: {
        set: <T = unknown>(name: string, data: T, options?: {
            [key: string]: unknown;
        }) => void;
        get: <T = unknown>(name: string, options?: {
            [key: string]: unknown;
        }) => T;
    };
    staticPath?: string;
    images?: StashOptionImages;
    googleMapsApiKey?: string;
    menus?: false | MenusPluginOptions;
    modals?: false | ModalsPluginOptions;
    toasts?: false | ToastsPluginOptions;
    dialogs?: false | DialogsPluginOptions;
}

export declare interface StashProvideState {
    components?: Record<string, DefineComponent>;
    directives?: Record<string, Directive>;
    i18n?: I18nPlugin;
    images: StashOptionImages;
    storage?: unknown;
    staticPath: string;
    googleMapsApiKey?: string;
}

export declare type StatusColor = `${StatusColors}`;

export declare enum StatusColors {
    Error = "red-500",
    Warning = "orange-500",
    Info = "blue-500",
    Success = "green-500"
}

export declare type StatusIcon = `${StatusIcons}`;

export declare enum StatusIcons {
    Error = "hazard",
    Warning = "circle-warning",
    Info = "circle-info",
    Success = "circle-check"
}

export declare enum StatusSeverities {
    Error = "error",
    Warning = "warning",
    Info = "info",
    Success = "success"
}

export declare type StatusSeverity = `${StatusSeverities}`;

declare interface ToastsPluginOptions {
    mountNodeClass?: string;
    mountNodeId?: string;
}

/**
 * @see {@link https://github.com/LeafLink/dev-page/tree/main/docs/api/getting-started#list-response-attributes Unified API List Response}
 */
export declare interface UnifiedApiListResponse<R = object> {
    count: number;
    next: string | null;
    previous: string | null;
    results: R[];
}

/**
 * @see {@link https://github.com/LeafLink/dev-page/tree/main/docs/api/getting-started#parameters Unified API Pagination Params}
 */
export declare interface UnifiedApiPaginationParams {
    ordering?: string;
    page?: number;
    pageSize?: number;
}


export * from "@leaflink/stash-types";
export * from "plaid-link";

export { }
