#!/usr/bin/env python3
"""Local checker for the supplied synthetic sample. Python 3, no dependencies."""
import csv
import io
import sys
from pathlib import Path

HEADERS = ["row_key", "identifier", "name"]
EXPECTED = {
    "R1": ["00123", "Žofie"],
    "R2": ["03-04", "Řehoř"],
    "R3": ["1E10", "Šárka"],
    "R4": ["00007", "Jiří"],
}

def check_text(text):
    errors = []
    try:
        rows = list(csv.reader(io.StringIO(text, newline=""), delimiter=",", strict=True))
    except csv.Error as exc:
        return [f"Invalid CSV: {exc}"]
    if not rows or rows[0] != HEADERS:
        return [f"Header must be exactly {HEADERS!r}."]
    seen = set()
    for number, row in enumerate(rows[1:], start=2):
        if len(row) != len(HEADERS):
            errors.append(f"Row {number}: expected 3 columns, found {len(row)}.")
            continue
        key = row[0]
        if key in seen:
            errors.append(f"Row {number}: duplicate row_key {key!r}.")
        seen.add(key)
        if key not in EXPECTED:
            errors.append(f"Row {number}: unexpected row_key {key!r}.")
            continue
        for field, actual, expected in zip(HEADERS[1:], row[1:], EXPECTED[key]):
            if actual != expected:
                errors.append(f"{key} / {field}: expected {expected!r}, found {actual!r}.")
    for key in EXPECTED:
        if key not in seen:
            errors.append(f"Missing row_key {key!r}.")
    return errors

def main(argv):
    if len(argv) != 2:
        print("Usage: python3 check-csv-import.py file.csv", file=sys.stderr)
        return 2
    try:
        with Path(argv[1]).open("r", encoding="utf-8-sig", newline="") as handle:
            errors = check_text(handle.read())
    except (OSError, UnicodeError) as exc:
        print(f"Cannot read file as UTF-8: {exc}", file=sys.stderr)
        return 2
    if errors:
        for error in errors:
            print(error)
        return 1
    print("OK: 4 rows; all values match the sample exactly.")
    return 0

if __name__ == "__main__":
    sys.exit(main(sys.argv))
