// WordPress Import Pipeline — Overview
// Render: dot -Tsvg docs/wordpress-import-pipeline.dot -o docs/wordpress-import-pipeline.dot.svg
digraph wordpress_import {
    rankdir=TB;
    node [shape=box, style="rounded,filled", fontname="monospace", fontsize=10];
    edge [fontname="monospace", fontsize=9];

    subgraph cluster_source {
        label="WordPress Source";
        style=dashed;
        color="#ad5871";

        rest_api [label="REST API\n/wp-json/wp/v2/*\n(live site, no auth)", fillcolor="#fce4ec"];
        wxr_file [label="WXR XML Export\n(offline file)\nTools > Export", fillcolor="#fce4ec"];
    }

    subgraph cluster_parser {
        label="Source Parser";
        style=dashed;
        color="#5871ad";

        api_parser [label="REST API Client\nrequests + pagination\nper_page=100, ?_embed", fillcolor="#e8eaf6"];
        wxr_parser [label="WXR Parser\nxml.etree.ElementTree\nnamespace-aware", fillcolor="#e8eaf6"];
        normalize [label="Normalize\nUnified post dict\n(title, html, date,\nmedia_urls, comments)", fillcolor="#e8eaf6"];
    }

    subgraph cluster_convert {
        label="HTML Conversion Pipeline";
        style=dashed;
        color="#58ad71";

        preprocess [label="Phase 1: Pre-process\nBeautifulSoup\n- strip Gutenberg comments\n- strip shortcodes\n- strip srcset/sizes\n- strip WP classes", fillcolor="#e8f5e9"];
        images [label="Phase 2: Image Migration\n- strip -WxH suffixes\n- download originals\n- upload to S3\n- rewrite URLs to CDN", fillcolor="#e8f5e9"];
        markdown [label="Phase 3: Markdown\nmarkdownify (MIT)\n- custom WPConverter\n- figures, code blocks\n- ATX headings", fillcolor="#e8f5e9"];
        postprocess [label="Phase 4: Post-process\n- collapse blank lines\n- prepend metadata\n- flag unconverted HTML", fillcolor="#e8f5e9"];
    }

    subgraph cluster_mps {
        label="MPS (Target)";
        style=dashed;
        color="#ad8f58";

        create_product [label="Create Product\nis_sellable=False\nset title, description,\ntimestamps, visibility", fillcolor="#fff8e1"];
        upload_thumb [label="Upload Thumbnail\nput_object to S3\nset_file_metadata\nACL=public-read", fillcolor="#fff8e1"];
        create_comments [label="Create Comments\nthreaded via parent_id\nmarkdown + sentiment", fillcolor="#fff8e1"];
        reforge [label="Reforge Discovery Ring\nJaccard similarity\nnearest-neighbor ordering", fillcolor="#fff8e1"];
    }

    subgraph cluster_storage {
        label="Storage";
        style=dashed;
        color="#666666";

        sqlite [label="SQLite\nproducts + comments", fillcolor="#f5f5f5"];
        s3 [label="S3 / Spaces\nthumbnails + inline images\nBYOB-aware", fillcolor="#f5f5f5"];
        cdn [label="CDN\npublic URLs\n?ts= cache bust", fillcolor="#f5f5f5"];
    }

    // Edges
    rest_api -> api_parser;
    wxr_file -> wxr_parser;
    api_parser -> normalize;
    wxr_parser -> normalize;

    normalize -> preprocess;
    preprocess -> images;
    images -> markdown;
    markdown -> postprocess;

    postprocess -> create_product;
    normalize -> create_comments [label="comments\n(optional)", style=dashed];
    normalize -> upload_thumb [label="featured\nimage URL", style=dashed];

    create_product -> sqlite;
    create_comments -> sqlite;
    upload_thumb -> s3;
    images -> s3 [label="inline\nimages"];
    s3 -> cdn;

    create_product -> reforge [label="after all\nproducts"];
    reforge -> sqlite;
}
