pub(crate) const QUERY_AFTER_LONG_HELP: &str = "Examples:\n\
qf query --input ./input.xlsx:Sheet1 --sql \"SELECT * FROM table\"\n\
qf query --input ./inventory.xml:Inventory --sql \"SELECT product, price FROM table WHERE active = 1\"\n\
qf query --input ./inventory.csv --sql \"SELECT product, price FROM table WHERE active = 1\"\n\
qf query --input ./inventory.json:Inventory --sql \"SELECT product, price FROM table WHERE active = 1\"\n\
qf query --input ./inventory.jsonl --sql \"SELECT product, price FROM table WHERE active = 1\"\n\
qf query --input ./a.xlsx:Sheet1 --input ./b.csv --sql \"SELECT * FROM table UNION ALL SELECT * FROM table2\"\n\
qf query --input sales=./sales.xlsx:Q1 --input costs=./costs.csv --sql \"SELECT * FROM sales JOIN costs ON sales.id = costs.id\"\n\
qf query --input ./inventory.md --sql \"SELECT product, price FROM table WHERE active = 1\"\n\
qf query --input ./inventory.md:2 --sql \"SELECT product, price FROM table\"\n\
qf query --input ./input.xlsx:Sheet1 --sql-file ./query.sql --output ./result.csv --format csv\n\
qf query --input ./summary.json --sql \"SELECT key, value FROM table\" --json-mode object\n\
qf query --input ./record.json --sql \"SELECT \\\"user.name\\\", \\\"address.city\\\" FROM table\" --json-mode flatten\n\
qf query --input ./config.xml --sql \"SELECT tag, value FROM table WHERE tag = 'timeout'\" --xml-mode descendants\n\
qf query --input ./items.xml --sql \"SELECT id, type, value FROM table\" --xml-mode attributes\n\
\n\
Query source:\n\
Provide SQL inline with --sql or load it from disk with --sql-file.\n\
\n\
Table naming:\n\
Without explicit names, inputs become table, table2, table3, ...\n\
Prefix inputs as NAME=PATH to use readable table names in SQL.\n\
\n\
JSON extraction modes (--json-mode):\n\
array (default): each element of a top-level array becomes a row.\n\
object: each key-value pair of a top-level object becomes a row with 'key' and 'value' columns.\n\
flatten: recursively flattens nested objects/arrays into a single row using dot-separated column names.\n\
\n\
XML extraction modes (--xml-mode):\n\
rows (default): detect and extract tabular rows from the XML structure.\n\
descendants: collect every leaf text element as a row with 'tag' and 'value' columns.\n\
attributes: collect elements with attributes; each attribute name becomes a column.";
pub(crate) const TABLES_AFTER_LONG_HELP: &str = "Examples:\n\
qf tables --input sales=./sales.xlsx:Q1 --input costs=./costs.csv\n\
qf tables --input ./inventory.json:Inventory --format json\n\
qf tables --input ./inventory.xml:Inventory --input ./inventory.csv --format markdown\n\
Output:\n\
Lists the logical SQL table names created from your inputs, in input order.\n\
Use this command before writing queries when you want to confirm automatic table names.";
pub(crate) const SCHEMA_AFTER_LONG_HELP: &str = "Examples:\n\
qf schema --input ./inventory.json:Inventory\n\
qf schema --input sales=./sales.xlsx:Q1 --input costs=./costs.csv --format json\n\
qf schema --input ./inventory.xml:Inventory --format markdown\n\
Output:\n\
Shows one row per column with the logical table name and inferred SQL-compatible type.\n\
Use this command to verify names and types before writing filters, joins, or casts.";
pub(crate) const INSPECT_AFTER_LONG_HELP: &str = "Examples:\n\
qf inspect --input ./inventory.md:2 --sample 5\n\
qf inspect --input sales=./sales.xlsx:Q1 --input costs=./costs.csv --format json\n\
qf inspect --input ./inventory.csv --stats --format markdown\n\
Output:\n\
Includes a compact summary for each table, sampled rows, and optional extra metrics.\n\
Use this command when you need fast diagnostics before or after adjusting normalization flags.";
pub(crate) const INPUT_DATASET_LONG_HELP: &str = "Input dataset path. Supported formats: .xlsx, .xml, .csv, .json, .jsonl, .md, .markdown, .parquet.\n\
Optionally prefix with a table name: NAME=PATH (e.g. sales=./sales.xlsx:Q1).\n\
Without a name prefix, tables are named 'table', 'table2', 'table3', ...\n\
For XLSX use PATH:SheetName to select a worksheet.\n\
For XML use PATH:TagName to select a subtree.\n\
For JSON use PATH:Key to select a top-level key.\n\
For Markdown use PATH:N for the 1-based table index.";
pub(crate) const QUERY_INPUT_DATASET_LONG_HELP: &str = "Input dataset path. Supported formats: .xlsx, .xml, .csv, .json, .jsonl, .md, .markdown, .parquet.\n\
Optionally prefix with a table name: NAME=PATH (e.g. sales=./sales.xlsx:Q1).\n\
Without a name prefix, tables are named 'table', 'table2', 'table3', ...\n\
For XLSX use PATH:SheetName (or PATH#SheetName) to select a worksheet.\n\
For XML use PATH:TagName (or PATH#TagName) to select a subtree; without sheet/tag the whole file is used.\n\
For JSON use PATH:Key (or PATH#Key) to select a top-level key; without key the whole JSON root is used.\n\
For Markdown use PATH:N (or PATH#N), where N is the 1-based table number; without key the first table is used.\n\
CSV, JSONL and Parquet do not support sheet/key selection.";
pub(crate) const DEFAULT_SELECTOR_LONG_HELP: &str =
"Default sheet/tag/key applied to every --input that does not already specify one.";
pub(crate) const TABLES_FORMAT_LONG_HELP: &str =
"Output format for table discovery results. Supported values: text, json, markdown.";
pub(crate) const SCHEMA_FORMAT_LONG_HELP: &str =
"Output format for schema results. Supported values: text, json, markdown.";
pub(crate) const INSPECT_FORMAT_LONG_HELP: &str =
"Output format for inspection results. Supported values: text, json, markdown.";