package main

import (
	"bufio"
	"flag"
	"fmt"
	"log"
	"os"
	"strings"
)

func hexout(text string) {
	for _, b := range []byte(text) {
		fmt.Printf("%02x ", b)
	}
	fmt.Println("")

}

func repr_line(line string) string {
	output := ""

	for _, ch := range []byte(line) {
		switch {
		case ch == '\'':
			output += "\\'"
		case ch == '"':
			output += "\\\""
		case ch == '\\':
			output += "\\\\"
		case ch < byte(0x20) || ch > byte(0x7e):
			output += fmt.Sprintf("\\x%02x", ch)
		default:
			output += string(ch)
		}
	}
	return output
}

func readfile(filename string) {
	var basename string
	var lines []string

	idx := strings.LastIndex(filename, "/")
	basename = filename[idx+1:]

	idx = strings.Index(basename, ".")
	basename = basename[:idx]

	file, err := os.Open(filename)
	if err != nil {
		log.Panicf("Open(%s): %s\n", filename, err)
	}

	defer file.Close()

	// Read the lines
	scanner := bufio.NewScanner(file)
	for scanner.Scan() {
		line := scanner.Text()
		lines = append(lines, line)
	}

	// Ok, is what we have usable, or did it mangle up our Latin1 text?
	// hexout(lines[0])

	fmt.Printf("func ANSI%s() [%d]string {\n", strings.Title(basename), len(lines))
	// insert CP437_to_Unicode in here, if needed.
	fmt.Printf("  data := [%d]string {\n", len(lines))
	for _, line := range lines {
		fmt.Printf("    \"%s\",\n", repr_line(line))
	}
	fmt.Println("  }")
	fmt.Println("  if !door.Unicode && !door.CP437 {")
	fmt.Println("    log.Panicf(\"Call after door.Init() so Unicode/CP437 has been set.\")")
	fmt.Println("  }")
	fmt.Println("  if door.Unicode {")
	fmt.Println("    for idx := range data {")
	fmt.Println("      data[idx] = door.CP437_to_Unicode(data[idx])")
	fmt.Println("    }")
	fmt.Println("  }")
	fmt.Println("  return data")
	fmt.Printf("}\n\n")
}

func main() {
	var defaultPackage string = "main"

	flag.StringVar(&defaultPackage, "p", "main", "Package name to use")
	flag.Parse()

	if flag.NArg() == 0 {
		fmt.Println("ANSI (CP437) to go converter.")
		fmt.Println("No ANSI filenames given.")
		flag.PrintDefaults()
		os.Exit(2)
	}

	fmt.Printf("package %s\n\n", defaultPackage)
	fmt.Printf("import (\n  \"red-green/door\"\n  \"log\"\n  )\n\n")
	for _, filename := range flag.Args() {
		readfile(filename)
	}
}