//! Block hover / block menu / drop indicator 共享状态类型定义。
//!
//! 本模块只承接共享状态类型，不承接 Leptos signal、DOM listener、host bridge
//! 或 editor command。类型字段使用 `pub(crate)` 以支持跨模块访问，保持结构
//! 和语义同构。

use web_sys::Element;

/// Hovered block 的共享状态：索引、类型标签、位置和高度。
#[derive(Clone, Debug, PartialEq)]
pub(crate) struct HoveredBlockState {
    pub(crate) index: usize,
    pub(crate) label: String,
    pub(crate) top: f64,
    pub(crate) height: f64,
}

/// Block menu 弹出面板的布局参数：最大高度、展开方向、位置。
#[derive(Clone, Debug, PartialEq)]
pub(crate) struct BlockMenuLayout {
    pub(crate) max_height: f64,
    pub(crate) open_upward: bool,
    pub(crate) top: f64,
    pub(crate) left: f64,
}

/// 拖拽放置方向：目标块之前或之后。
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub(crate) enum DropPlacement {
    Before,
    After,
}

/// 拖拽指示器的显示状态：目标索引、位置和放置方向。
#[derive(Clone, Debug, PartialEq)]
pub(crate) struct DropIndicatorState {
    pub(crate) index: usize,
    pub(crate) top: f64,
    pub(crate) placement: DropPlacement,
}

/// 拖拽待确认状态：记录开始拖拽时的索引、锚点和起始坐标。
#[derive(Clone, Debug, PartialEq)]
pub(crate) struct PendingDragState {
    pub(crate) index: usize,
    pub(crate) anchor: HoveredBlockState,
    pub(crate) start_x: i32,
    pub(crate) start_y: i32,
}

pub(crate) fn block_label_for_element(block: &Element) -> String {
    match block.get_attribute("data-type").as_deref() {
        Some("taskList") => "Todo 列表".to_string(),
        Some("taskItem") => "Todo 项".to_string(),
        _ => match block.tag_name().as_str() {
            "H1" => "一级标题".to_string(),
            "H2" => "二级标题".to_string(),
            "H3" => "三级标题".to_string(),
            "P" => "段落".to_string(),
            "UL" => "无序列表".to_string(),
            "OL" => "有序列表".to_string(),
            "BLOCKQUOTE" => "引用块".to_string(),
            "PRE" => "代码块".to_string(),
            "HR" => "分割线".to_string(),
            other => format!("块节点 {other}"),
        },
    }
}
