use std::path::PathBuf;

use super::*;

const INPUT: &str = include_str!("input.md");
const OUTPUT_PATH: &[&str] =
    &[env!("CARGO_MANIFEST_DIR"), "src", "markdown", "tests", "output.stdout"];

const TEST_WIDTH: usize = 80;

// We try to make some words long to create corner cases
const TXT: &str = r"Lorem ipsum dolor sit amet, consecteturadipiscingelit.
Fusce-id-urna-sollicitudin, pharetra nisl nec, lobortis tellus. In at
metus hendrerit, tincidunteratvel, ultrices turpis. Curabitur_risus_sapien,
porta-sed-nunc-sed, ultricesposuerelacus. Sed porttitor quis
dolor non venenatis. Aliquam ut. ";

const WRAPPED: &str = r"Lorem ipsum dolor sit amet, consecteturadipiscingelit. Fusce-id-urna-
sollicitudin, pharetra nisl nec, lobortis tellus. In at metus hendrerit,
tincidunteratvel, ultrices turpis. Curabitur_risus_sapien, porta-sed-nunc-sed,
ultricesposuerelacus. Sed porttitor quis dolor non venenatis. Aliquam ut. Lorem
    ipsum dolor sit amet, consecteturadipiscingelit. Fusce-id-urna-
    sollicitudin, pharetra nisl nec, lobortis tellus. In at metus hendrerit,
    tincidunteratvel, ultrices turpis. Curabitur_risus_sapien, porta-sed-nunc-
    sed, ultricesposuerelacus. Sed porttitor quis dolor non venenatis. Aliquam
    ut. Sample link lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet,
consecteturadipiscingelit. Fusce-id-urna-sollicitudin, pharetra nisl nec,
lobortis tellus. In at metus hendrerit, tincidunteratvel, ultrices turpis.
Curabitur_risus_sapien, porta-sed-nunc-sed, ultricesposuerelacus. Sed porttitor
quis dolor non venenatis. Aliquam ut. ";

#[test]
fn test_wrapping_write() {
    WIDTH.with(|w| w.set(TEST_WIDTH));
    let mut buf = Vec::new();
    let txt = TXT.replace("-\n", "-").replace("_\n", "_").replace('\n', " ").replace("    ", "");
    write_wrapping(&mut buf, &txt, 0, None, None).unwrap();
    write_wrapping(&mut buf, &txt, 4, None, None).unwrap();
    write_wrapping(
        &mut buf,
        "Sample link lorem ipsum dolor sit amet. ",
        4,
        Some("link-address-placeholder"),
        None,
    )
    .unwrap();
    write_wrapping(&mut buf, &txt, 0, None, None).unwrap();
    let out = String::from_utf8(buf).unwrap();
    let out = out
        .replace("\x1b\\", "")
        .replace('\x1b', "")
        .replace("]8;;", "")
        .replace("link-address-placeholder", "");

    for line in out.lines() {
        assert!(line.len() <= TEST_WIDTH, "line length\n'{line}'")
    }

    assert_eq!(out, WRAPPED);
}

#[test]
fn test_output() {
    // Capture `--bless` when run via ./x
    let bless = std::env::var_os("RUSTC_BLESS").is_some_and(|v| v != "0");
    let ast = MdStream::parse_str(INPUT);
    let mut buffer = Vec::new();
    ast.write_anstream_buf(&mut buffer).unwrap();

    let mut blessed = PathBuf::new();
    blessed.extend(OUTPUT_PATH);

    if bless {
        std::fs::write(&blessed, buffer.as_slice()).unwrap();
        eprintln!("blessed output at {}", blessed.display());
    } else {
        let output = buffer.as_slice();
        if std::fs::read(blessed).unwrap() != output {
            // hack: I don't know any way to write bytes to the captured stdout
            // that cargo test uses
            let mut out = std::io::stdout();
            out.write_all(b"\n\nMarkdown output did not match. Expected:\n").unwrap();
            out.write_all(&output).unwrap();
            out.write_all(b"\n\n").unwrap();
            panic!("markdown output mismatch");
        }
    }
}
