#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
CleverCSV command line program.

Author: Gertjan van den Burg

"""

import argparse
import clevercsv
import sys
import tabview


def exception(msg):
    print("ERROR: " + msg, file=sys.stderr)
    raise SystemExit(1)


def standardize(filename, dialect, output, encoding=None):
    if output is None:
        oid = sys.stdout
    else:
        oid = open(output, "w")
    with open(filename, "r", newline="", encoding=encoding) as fid:
        reader = ccsv.reader(fid, dialect=dialect)
        writer = ccsv.writer(oid, dialect="excel")
        for row in reader:
            writer.writerow(row)
    if not output is None:
        oid.close()


def view(filename, dialect, encoding=None):
    with open(filename, "r", newline="", encoding=encoding) as fid:
        reader = ccsv.reader(fid, dialect=dialect)
        data = list(reader)
    tabview.view(data)


def parse_args():
    parser = argparse.ArgumentParser()
    parser.add_argument(
        "action", choices=["standardize", "view", "detect"], default="detect"
    )
    parser.add_argument(
        "-e",
        "--encoding",
        help="provide encoding for the file (detected otherwise)",
        default=None,
    )
    parser.add_argument(
        "-i",
        "--interactive",
        help="allow user interaction",
        action="store_true",
    )
    parser.add_argument(
        "-o",
        "--output",
        help="output file, if omitted print to stdout",
        default=None,
    )
    parser.add_argument(
        "-v", "--verbose", help="be verbose", action="store_true"
    )
    parser.add_argument(
        "input", help="input csv file, if omitted assuming stdin", nargs="?"
    )
    return parser.parse_args()


def main():
    args = parse_args()
    if args.encoding is None:
        enc = ccsv.utils.get_encoding(args.input)
    else:
        enc = args.encoding

    with open(args.input, "r", newline="", encoding=enc) as fid:
        dialect = ccsv.Detector().detect(fid.read(), verbose=args.verbose)

    if args.action == "detect":
        print("Detected dialect:", dialect)
    elif args.action == "standardize":
        standardize(args.input, dialect, args.output, encoding=enc)
    elif args.action == "view":
        view(args.input, dialect, encoding=enc)
    else:
        raise SystemExit(1)


if __name__ == "__main__":
    main()
