#!/usr/bin/env python3
# SPDX-License-Identifier: WTFPL

from argparse import ArgumentParser
from collections import OrderedDict
import csv
import json
import sys


def sniff(fn):
	with open(fn) as fd:
		sn = csv.Sniffer()
		return sn.sniff(fd.read(1024))


def read_rows(fd, args):
	if args.header or args.columns:
		for row in csv.DictReader(fd, fieldnames=args.columns, delimiter=args.delimiter):
			yield row
	else:
		for row in csv.reader(fd, delimiter=args.delimiter):
			yield OrderedDict((str(n), v) for n, v in enumerate(row))


def main():
	parser = ArgumentParser()
	parser.add_argument(
		"--columns",
		help="Comma-separated list of CSV fields, like forcing a CSV header."
		+ " See --header. Does not skip the first line.",
	)
	parser.add_argument(
		"--header", action="store_true",
		help="The first CSV row is a header, take its cells as column names."
		+ " The JSON output will use these keys in each row.",
	)
	parser.add_argument(
		"-d", "--delimiter", default=",",
		help="Input CSV delimiter (default: ',')",
	)
	parser.add_argument(
		"--sniff", action="store_true",
		help="Try to guess the CSV format and header. May not work as expected."
	)
	parser.add_argument('file', nargs="?", default="-")
	args = parser.parse_args()

	if args.columns:
		args.columns = args.columns.split(",")

	if args.file == "-":
		fd = sys.stdin
	else:
		fd = open(args.file)

	with fd:
		data = list(read_rows(fd, args))
	print(json.dumps(data))


if __name__ == '__main__':
	main()
