use hard_xml::XmlRead;
use rs_docx::document::{Inline, Pict, Run, RunContent};
use rs_docx::formatting::{GridSpan, VMerge, VMergeType};

#[test]
fn test_vml_pict_parsing() {
    let xml = r#"<w:pict><v:shape id="Shape1" style="width:100;height:100"><v:imagedata r:id="rId1" o:title="Test Image"/></v:shape></w:pict>"#;
    let pict = Pict::from_str(xml).expect("Failed to parse Pict");

    let shape = pict.shape.expect("Shape not found");
    assert_eq!(shape.id.as_deref(), Some("Shape1"));

    let image_data = shape.image_data.expect("ImageData not found");
    assert_eq!(image_data.id.as_deref(), Some("rId1"));
    assert_eq!(image_data.title.as_deref(), Some("Test Image"));
}

#[test]
fn test_table_merge_parsing() {
    let xml_vmerge = r#"<w:vMerge w:val="restart"/>"#;
    let vmerge = VMerge::from_str(xml_vmerge).expect("Failed to parse VMerge");
    assert_eq!(vmerge.val, Some(VMergeType::Restart));

    let xml_gridspan = r#"<w:gridSpan w:val="3"/>"#;
    let gridspan = GridSpan::from_str(xml_gridspan).expect("Failed to parse GridSpan");
    assert_eq!(gridspan.val, 3);
}

#[test]
fn test_run_with_pict() {
    let xml = r#"<w:r><w:pict><v:shape id="S1"/></w:pict></w:r>"#;
    let run = Run::from_str(xml).expect("Failed to parse Run with Pict");

    let has_pict = run.content.iter().any(|c| matches!(c, RunContent::Pict(_)));
    assert!(has_pict, "Run should contain Pict");
}

#[test]
fn test_drawing_inline_extension() {
    // wp14:anchorId and editId
    let xml = r#"<wp:inline distT="0" distB="0" distL="0" distR="0" wp14:anchorId="12345678" wp14:editId="87654321"><wp:extent cx="1" cy="1"/><wp:docPr id="1" name="X"/><a:graphic xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"><a:graphicData uri="uri"><pic:pic xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture"><pic:nvPicPr><pic:cNvPr id="0" name=""/></pic:nvPicPr><pic:blipFill><a:blip r:embed="rId1"/></pic:blipFill><pic:spPr><a:prstGeom prst="rect"><a:avLst/></a:prstGeom></pic:spPr></pic:pic></a:graphicData></a:graphic></wp:inline>"#;

    // Note: XmlRead usually ignores unknown attributes unless strictly defined?
    // hard-xml (our parser) typically ignores unless defined.
    // We defined anchorId/editId, so it should parse them (or at least not fail, and hopefully capture them).

    let inline = Inline::from_str(xml).expect("Failed to parse Inline");

    // Note: namespaces in attributes might be tricky in hard-xml if not fully handled,
    // but our struct definition is #[xml(attr = "wp14:anchorId")].
    assert_eq!(inline.anchor_id.as_deref(), Some("12345678"));
    assert_eq!(inline.edit_id.as_deref(), Some("87654321"));
}
