/**
 * App Configuration
 */

// App constants
export const APP_DEFAULTS = Object.freeze({
    // Debug / diagnostics (opt-in)
    DEBUG_SAFE_CALL: false,
    DEBUG_SAFE_LISTENERS: false,
    DEBUG_VIEWER: false,

    // Viewer
    VIEWER_ALLOW_PAN_AT_ZOOM_1: false,
    VIEWER_DISABLE_WEBGL_VIDEO: false,
    VIEWER_DISABLE_WEBGL_AUDIO: false,
    VIEWER_VIDEO_GRADE_THROTTLE_FPS: 12,
    VIEWER_AUDIO_VISUALIZER_MODE: "artistic", // simple|artistic
    VIEWER_AUDIO_VIS_FPS: 18,
    VIEWER_SCOPES_FPS: 8,

    // Grid
    GRID_MIN_SIZE: 150,
    FEED_GRID_MIN_SIZE: 120,
    GRID_GAP: 10,
    GRID_SHOW_BADGES_EXTENSION: true,
    GRID_SHOW_BADGES_RATING: true,
    GRID_SHOW_BADGES_TAGS: true,
    GRID_SHOW_DETAILS: true,
    GRID_SHOW_DETAILS_FILENAME: true,
    GRID_SHOW_DETAILS_DATE: true,
    GRID_SHOW_DETAILS_DIMENSIONS: true,
    GRID_SHOW_DETAILS_GENTIME: true,
    GRID_SHOW_HOVER_INFO: true,
    GRID_SHOW_WORKFLOW_DOT: true,
    WORKFLOW_GRID_GROUP_BY: "model", // "none" | "task" | "model" | "category"
    GRID_VIDEO_AUTOPLAY_MODE: "hover", // "off" | "hover" | "always"

    // Bottom feed card display
    FEED_SHOW_INFO: true,
    FEED_SHOW_FILENAME: false,
    FEED_SHOW_DIMENSIONS: true,
    FEED_SHOW_DATE: true,
    FEED_SHOW_GENTIME: true,
    FEED_SHOW_WORKFLOW_DOT: false,
    FEED_SHOW_BADGES_EXTENSION: true,
    FEED_SHOW_BADGES_RATING: true,
    FEED_SHOW_BADGES_TAGS: true,
    UI_CARD_HOVER_COLOR: "#3D3D3D",
    UI_CARD_SELECTION_COLOR: "#4A90E2",
    UI_RATING_COLOR: "#FF9500",
    UI_TAG_COLOR: "#4A90E2",

    // Badge colors
    BADGE_STAR_COLOR: "#FFD45A",
    BADGE_IMAGE_COLOR: "#2196F3",
    BADGE_VIDEO_COLOR: "#9C27B0",
    BADGE_AUDIO_COLOR: "#FF9800",
    BADGE_MODEL3D_COLOR: "#4CAF50",
    BADGE_DUPLICATE_ALERT_COLOR: "#FF1744",

    // Pagination
    DEFAULT_PAGE_SIZE: 80,
    // Upper bound for a single list request. The backend allows more, but very large
    // pages can create huge DOM batches; keep this as a safety cap.
    MAX_PAGE_SIZE: 2000,
    // Prefetch next page after the first paint so initial grid render stays responsive
    PREFETCH_NEXT_PAGE: true,
    PREFETCH_NEXT_PAGE_DELAY_MS: 700,
    // Client-side default for search request limit (user-adjustable in settings)
    SEARCH_DEFAULT_LIMIT: 500,
    INFINITE_SCROLL_ENABLED: true,
    INFINITE_SCROLL_ROOT_MARGIN: "800px",
    INFINITE_SCROLL_THRESHOLD: 0.01,
    // Consider user "at bottom" when within this many pixels of the end.
    BOTTOM_GAP_PX: 80,

    // Polling
    STATUS_POLL_INTERVAL: 5000, // 5 seconds

    // Auto-scan on startup
    AUTO_SCAN_ON_STARTUP: false,
    EXECUTION_GROUPING_ENABLED: true,
    EXECUTION_IDLE_GRACE_MS: 6000,
    // Generation/execution must NEVER block panel navigation, scope switches,
    // grid loads, or file I/O. Backend handlers are independent of the prompt
    // queue. Keep this false unless explicitly debugging contention.
    DEFER_GRID_FETCH_DURING_EXECUTION: false,
    VIEWER_PAUSE_DURING_EXECUTION: true,
    FLOATING_VIEWER_PAUSE_DURING_EXECUTION: false,
    MFV_SIDEBAR_POSITION: "right",
    MFV_LIVE_DEFAULT: true,
    MFV_PREVIEW_DEFAULT: true,
    MFV_LIVE_AUTO_OPEN: false,
    MFV_PREVIEW_AUTO_OPEN: false,
    MFV_NODE_STREAM_AUTO_OPEN: false,
    MFV_PREVIEW_METHOD: "auto",

    // Rating/tags hydration (grid)
    RT_HYDRATE_CONCURRENCY: 2,
    RT_HYDRATE_QUEUE_MAX: 100,
    RT_HYDRATE_SEEN_MAX: 20000,
    RT_HYDRATE_PRUNE_BUDGET: 250,
    RT_HYDRATE_SEEN_TTL_MS: 10 * 60 * 1000,

    // Viewer metadata cache
    VIEWER_META_TTL_MS: 30_000,
    VIEWER_META_MAX_ENTRIES: 500,

    // Workflow Minimap
    WORKFLOW_MINIMAP_ENABLED: true,
    WATCHER_DEBOUNCE_MS: 3000,
    WATCHER_DEDUPE_TTL_MS: 3000,
    WATCHER_MAX_PENDING: 500,
    WATCHER_MIN_SIZE: 100,
    WATCHER_MAX_SIZE: 4294967296,
    // DB tuning (user-settable via advanced settings)
    DB_TIMEOUT_MS: 5000,
    DB_MAX_CONNECTIONS: 10,
    DB_QUERY_TIMEOUT_MS: 1000,
    // Search limit (user-settable via settings)
    SEARCH_REQUEST_LIMIT: 500,
    // UI safety knobs
    DELETE_CONFIRMATION: true,
    DEBUG_VERBOSE_ERRORS: false,
    SIDEBAR_ASSET_BADGE_ENABLED: true,
});

// Widen literal types to their base types and strip readonly to allow runtime mutation.
type WideConfig<T> = { -readonly [K in keyof T]: T[K] extends number ? number : T[K] extends boolean ? boolean : T[K] extends string ? string : T[K] };

// Runtime config (some values are user-tunable via settings).
export const APP_CONFIG: WideConfig<typeof APP_DEFAULTS> & Record<string, any> = {
    ...APP_DEFAULTS,
};

export type AppConfig = WideConfig<typeof APP_DEFAULTS>;
