import type { Datum } from "../charts/shared/datumTypes";
import { type StretchSuggestion } from "./suggestStretchCharts";
import type { ChartDataProfile, Suggestion } from "./chartCapabilityTypes";
import type { IntentId } from "./intents";
import type { AudienceProfile } from "./audienceProfile";
/**
 * One panel in a generated dashboard. Pairs a chart suggestion with the
 * intent that motivated it — consumers render the suggestion and label it
 * with the intent so readers know *why* that panel exists.
 */
export interface DashboardPanel {
    /** The intent this panel covers. */
    intent: IntentId;
    /** The chart picked for that intent. */
    suggestion: Suggestion;
}
export interface DashboardSuggestion {
    /** Ordered panels, each covering a distinct intent. */
    panels: DashboardPanel[];
    /** Intents the engine actually filled. */
    intentsCovered: IntentId[];
    /** Intents the engine couldn't fill from this data. */
    intentsMissing: IntentId[];
    /**
     * Stretch panels — unfamiliar-but-fitting charts the audience could grow
     * into. Empty when no `audience` is provided or `exposureLevel` is 0.
     * Render alongside the main panels in a distinct surface so users see
     * them as opt-in literacy growth, not silent defaults.
     */
    stretchPanels: StretchSuggestion[];
    /** The shape profile (computed once, reused for every panel). */
    profile: ChartDataProfile;
}
export interface SuggestDashboardOptions {
    /**
     * Intents to attempt. When omitted, the engine picks a sensible default set
     * based on the data shape (e.g. if `hasTimeAxis`, include "trend"; if
     * `categoryCount`, include "rank" and "part-to-whole").
     */
    intents?: ReadonlyArray<IntentId>;
    /** Maximum number of panels. Default 6. */
    maxPanels?: number;
    /**
     * When true (default), prefer not to repeat the same chart family across
     * panels — produces a more varied dashboard. Set false to allow duplicates.
     */
    diversifyByFamily?: boolean;
    /** Allow only these component names. */
    allow?: ReadonlyArray<string>;
    /** Exclude these component names. */
    deny?: ReadonlyArray<string>;
    /** Optional pre-built profile (avoids recomputation). */
    profile?: ChartDataProfile;
    /** Non-tabular payload — forwarded to profileData. */
    rawInput?: unknown;
    /**
     * Audience profile — applies familiarity overrides and adoption-target bias
     * to every panel's ranking. When set with `exposureLevel >= 1`, the dashboard
     * additionally returns `stretchPanels` showing unfamiliar-but-fitting charts.
     */
    audience?: AudienceProfile;
    /** Max stretch panels (default min(maxPanels, 3)). */
    maxStretchPanels?: number;
}
/**
 * Generate a dashboard: a set of complementary chart panels, each
 * answering a distinct analytical intent on the same dataset.
 *
 * The contract: every panel has a stated `intent` and a suggestion that
 * fits that intent. The engine diversifies by chart family by default to
 * avoid "every panel is a bar chart" outcomes. Intents that can't be
 * filled from the data (e.g. "geo" on row data with no lat/lon) are
 * reported in `intentsMissing` so consumers can show "no fit for geo
 * here" rather than silently dropping them.
 *
 * Heuristic only — no LLM call. The result is suitable for direct
 * rendering (each panel's `suggestion.props` is spreadable into the
 * matching chart) or for piping to an LLM as composition context.
 *
 * @example
 * const { panels } = suggestDashboard(data)
 * return (
 *   <Grid>
 *     {panels.map(({ intent, suggestion }) => (
 *       <Panel key={intent} title={intent}>
 *         <DynamicChart component={suggestion.component} props={suggestion.props} />
 *       </Panel>
 *     ))}
 *   </Grid>
 * )
 */
export declare function suggestDashboard(data: ReadonlyArray<Datum> | null | undefined, options?: SuggestDashboardOptions): DashboardSuggestion;
