"""Preview UTF-8 input using validated TOML settings. Python 3.11+."""
import argparse
from itertools import islice
import json
from pathlib import Path
import sys
import tomllib


def valid_limit(value):
    if type(value) is not int or not 1 <= value <= 1000:
        raise ValueError("limit must be an integer from 1 to 1000")
    return value


def cli_limit(value):
    try:
        return valid_limit(int(value))
    except ValueError as exc:
        raise argparse.ArgumentTypeError(str(exc)) from exc


def load_settings(config):
    config = config.expanduser().resolve(strict=True)
    with config.open("rb") as file:
        data = tomllib.load(file)
    if set(data) != {"task"}:
        raise ValueError("top level must contain only [task]")
    task = data["task"]
    if not isinstance(task, dict):
        raise ValueError("task must be a table")
    unknown = set(task) - {"input", "limit"}
    if unknown:
        raise ValueError("unknown task keys: " + ", ".join(sorted(unknown)))
    raw_input = task.get("input")
    if not isinstance(raw_input, str) or not raw_input.strip():
        raise ValueError("task.input must be a nonempty string")
    limit = valid_limit(task.get("limit", 3))
    input_path = Path(raw_input).expanduser()
    if not input_path.is_absolute():
        input_path = config.parent / input_path
    return config, input_path.resolve(strict=True), limit


def main():
    parser = argparse.ArgumentParser(description=__doc__, allow_abbrev=False)
    parser.add_argument("--config", required=True, type=Path, help="TOML file")
    parser.add_argument("--limit", type=cli_limit, help="override preview line limit")
    args = parser.parse_args()
    try:
        config, input_path, limit = load_settings(args.config)
        if args.limit is not None:
            limit = args.limit
        with input_path.open(encoding="utf-8") as file:
            lines = [line.rstrip("\r\n") for line in islice(file, limit)]
        print(json.dumps({
            "config": str(config),
            "input": str(input_path),
            "limit": limit,
            "lines": lines,
        }, ensure_ascii=False, indent=2))
    except (OSError, ValueError, RuntimeError) as exc:
        print(f"ERROR: {exc}", file=sys.stderr)
        return 1
    return 0


if __name__ == "__main__":
    raise SystemExit(main())
