# retoor <retoor@molodetz.nl>
import argparse
import csv

SIZE = (10, 6)
DPI = 120
MAX_POINTS = 500


def _pyplot():
    import matplotlib

    matplotlib.use("Agg")
    import matplotlib.pyplot as plt

    return plt


def _write_csv(path, header, rows):
    with open(path, "w", newline="", encoding="utf-8") as handle:
        writer = csv.writer(handle)
        writer.writerow(header)
        writer.writerows(rows)


def _save(figure, png_path, plt):
    figure.tight_layout()
    figure.savefig(png_path)
    plt.close(figure)


def line_chart(title, xs, ys, xlabel, ylabel, png_path, csv_path):
    rows = list(zip(xs, ys))[:MAX_POINTS]
    _write_csv(csv_path, [xlabel, ylabel], rows)
    plt = _pyplot()
    figure, axes = plt.subplots(figsize=SIZE, dpi=DPI)
    axes.plot([row[0] for row in rows], [row[1] for row in rows], linewidth=2)
    axes.set_title(title)
    axes.set_xlabel(xlabel)
    axes.set_ylabel(ylabel)
    axes.grid(True, alpha=0.3)
    _save(figure, png_path, plt)
    return png_path, csv_path


def bar_chart(title, labels, values, ylabel, png_path, csv_path):
    rows = list(zip(labels, values))[:MAX_POINTS]
    _write_csv(csv_path, ["label", ylabel], rows)
    plt = _pyplot()
    figure, axes = plt.subplots(figsize=SIZE, dpi=DPI)
    axes.bar([row[0] for row in rows], [row[1] for row in rows])
    axes.set_title(title)
    axes.set_ylabel(ylabel)
    figure.autofmt_xdate(rotation=30)
    _save(figure, png_path, plt)
    return png_path, csv_path


def read_pairs(path):
    with open(path, newline="", encoding="utf-8") as handle:
        rows = list(csv.reader(handle))
    body = rows[1:] if rows and len(rows) > 1 else []
    xs, ys = [], []
    for row in body:
        if len(row) < 2:
            continue
        try:
            xs.append(float(row[0]))
            ys.append(float(row[1]))
        except ValueError:
            xs.append(row[0])
            ys.append(row[1])
    return xs, ys


if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="Render a PNG chart plus its source CSV from a two-column CSV.")
    parser.add_argument("data", help="Input CSV with header plus x,y rows")
    parser.add_argument("--kind", choices=("line", "bar"), default="line", help="Chart kind")
    parser.add_argument("--title", required=True, help="Chart title")
    parser.add_argument("--xlabel", default="x", help="X axis label")
    parser.add_argument("--ylabel", default="y", help="Y axis label")
    parser.add_argument("--png", required=True, help="Output PNG path")
    parser.add_argument("--csv", required=True, help="Output source CSV path")
    args = parser.parse_args()
    xs, ys = read_pairs(args.data)
    if args.kind == "bar":
        bar_chart(args.title, xs, ys, args.ylabel, args.png, args.csv)
    else:
        line_chart(args.title, xs, ys, args.xlabel, args.ylabel, args.png, args.csv)
    print(f"{args.png} {args.csv}")
