package main

import (
	"encoding/csv"
	"flag"
	"fmt"
	"github.com/olekukonko/tablewriter"
	"io"
	"os"
	"unicode/utf8"
)

var (
	fileName  = flag.String("f", "", "Set file with  eg. sample.csv")
	delimiter = flag.String("d", ",", "Set CSV File delimiter eg. ,|;|\t ")
	header    = flag.Bool("h", true, "Set header options eg. true|false ")
	align     = flag.String("a", "none", "Set aligmement with eg. none|left|right|center")
	pipe      = flag.Bool("p", false, "Suport for Piping from STDIN")
	border      = flag.Bool("b", true, "Enable / disable table border")
)

func main() {
	flag.Parse()
	fmt.Println()
	if *pipe || hasArg("-p") {
		process(os.Stdin)
	} else {
		if *fileName == "" {
			fmt.Fprintf(os.Stderr, "Usage of %s:\n", os.Args[0])
			flag.PrintDefaults()
			fmt.Println()
			os.Exit(1)
		}
		processFile()
	}
	fmt.Println()
}

func hasArg(name string) bool {
	for _ , v := range os.Args {
		if name == v {
			return true
		}
	}
	return false
}
func processFile() {
	r, err := os.Open(*fileName)
	if err != nil {
		exit(err)
	}
	defer r.Close()
	process(r)
}
func process(r io.Reader) {
	csvReader := csv.NewReader(r)
	rune, size := utf8.DecodeRuneInString(*delimiter)
	if size == 0 {
		rune = ','
	}
	csvReader.Comma = rune

	table, err := tablewriter.NewCSVReader(os.Stdout, csvReader, *header)

	if err != nil {
		exit(err)
	}

	switch *align {
	case "left":
		table.SetAlignment(tablewriter.ALIGN_LEFT)
	case "right":
		table.SetAlignment(tablewriter.ALIGN_RIGHT)
	case "center":
		table.SetAlignment(tablewriter.ALIGN_CENTER)
	}
	table.SetBorder(*border)
	table.Render()
}

func exit(err error) {
	fmt.Fprintf(os.Stderr, "#Error : %s", err)
	os.Exit(1)
}
