package main

import (
	"errors"
	"fmt"
	"strconv"
	"strings"
)

// because flag.* sucks.
func ParseArgs(argv []string) (int, int, string, bool, error) {

	length := 30
	lines := 10
	pattern := "a-zA-Z0-9"
	help := false
	var err error

	set := 0

	for i := 0; i < len(argv) && err == nil; i++ {

		if (set&0b001) == 0 && argv[i][0:2] == "-s" {

			set |= 0b001

			if len(argv[i]) > 2 {

				if argv[i][2] == '=' {
					length, lines, err = parseLength(argv[i][3:])
				} else {
					length, lines, err = parseLength(argv[i][2:])
				}

			} else {

				if i+1 == len(argv) {
					err = errors.New("no argument specified for option -s")
				} else {
					length, lines, err = parseLength(argv[i+1])
					i++
				}

			}

		} else if (set&0b100) == 0 && (argv[i] == "-h" || argv[i] == "--help") {
			set |= 0b100
			help = true
		} else if (set & 0b010) == 0 {
			set |= 0b010
			pattern = argv[i]
		} else {
			err = errors.New(fmt.Sprintf("unexpected argument %v", argv[i]))
		}

	}

	if err != nil {
		help = true
	}

	return length, lines, pattern, help, err

}

func parseLength(param string) (int, int, error) {

	param = strings.ToLower(param)

	if !strings.Contains(param, "x") {
		param += "x1"
	}

	s := strings.Split(param, "x")
	f := false

	length, e := strconv.Atoi(s[0])

	if e != nil {
		f = true
	}

	lines, e := strconv.Atoi(s[1])

	if e != nil || length < 1 || lines < 1 {
		f = true
	}

	var err error

	if f {
		err = errors.New("invalid argument specified for option -s")
	}

	return length, lines, err

}