#!/usr/bin/env python3
# Yonghang Wang

import sys
import argparse
import os
import re
import csv
import copy
from wcwidth import wcswidth
from collections import defaultdict
from itertools import zip_longest
from sretools import SimpleTable

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('-n', '--lineno', dest='lineno', default=False, action='store_true', help='show line no.')
    parser.add_argument('-H', '--header', dest='header', help='header columns')
    parser.add_argument('-f', '--infile', dest='infile', help='input file')
    parser.add_argument('-C', '--dump-column', dest='dumpcols', help='only print columns indentified by index numbers.')
    parser.add_argument('-s', '--sortby', dest='sortby', help='column id starts with 0.')
    parser.add_argument('-d', '--delimiter', dest='delimiter', default=",", help='char to seperate columns')
    parser.add_argument('-q', '--quotechar', dest='quotechar', default="\"", help='char to seperate columns')
    parser.add_argument('-w', '--maxwidth', dest='maxwidth', type=int, default=-1, help='max col width when print in console, min==20')
    parser.add_argument('-p', '--pivot', dest='pivot', action='store_true', default=False, help='pivot wide tables.')
    parser.add_argument('-F', '--format', dest='format', help='other than console table, json,yaml or csv')
    parser.add_argument('-X', '--debug', dest='debug', action='store_true', default=False, help='debug mode')
    args = parser.parse_args()

    header = list()
    data = list()
    if args.lineno:
        header.append('#')
    headered = False
    if args.header :
        header += re.split(args.delimiter,args.header)
        headered = True
    if not args.infile : 
        INPUT = sys.stdin
    else :
        INPUT = open(args.infile,"r",newline='') 
    #with open(args.infile,"r",newline='') as f :
    if True :
        cr = csv.reader(INPUT, delimiter=args.delimiter, quotechar=args.quotechar)
        if not headered :
            header += next(cr)
            headered = True
        for r in cr :
            data.append(r)
    INPUT.close()

    if args.sortby:
        def fsort(x):
            v = list()
            for i in re.split(r",", args.sortby):
                v0 = x[int(i)] or ""
                if re.match(r"^\d+(\.\d*)*$",v0) :
                    v.append(float(v0))
                else :
                    v.append(0)
                v.append(v0)
            return v
        data = sorted(data, key=fsort)
    if args.pivot:
        print(
            SimpleTable(header=header, data=data,
                        cols=args.dumpcols).repr_pivot())
    else:
        t = SimpleTable(header=header, data=data, cols=args.dumpcols,maxwidth=args.maxwidth)
        if args.format == "json" :
            print(t.get_json(),end="")
        elif args.format == "yaml" :
            print(t.get_yaml(),end="")
        elif args.format == "csv" :
            print(t.get_csv(),end="")
        else :
            print(t,end="")


if __name__ == "__main__":
    main()
