package main

import (
	"fmt"
	"strings"

	h "git.bullercodeworks.com/brian/adventofcode/helpers"
)

func main() {
	inp := h.StdinToStringSlice()
	validate(inp, h.OptArgNumber(1, "1"))
}

func validate(input []string, p string) {
	policy := h.Atoi(p)
	var good, bad []string
	for _, v := range input {
		if policy == 1 {
			if validSledRentalPolicy(v) {
				good = append(good, v)
			} else {
				bad = append(bad, v)
			}
		} else {
			if validTobogganPolicy(v) {
				good = append(good, v)
			} else {
				bad = append(bad, v)
			}
		}
	}
	fmt.Printf("There are %d valid passwords\n", len(good))
}

func validSledRentalPolicy(line string) bool {
	min := -1
	max := -1
	req := ""
	var buff string
	for i := 0; i < len(line); i++ {
		if req != "" {
			buff = buff + string(line[i])
			continue
		}
		switch line[i] {
		case '-':
			min = h.Atoi(buff)
			buff = ""
		case ' ':
			if max == -1 {
				max = h.Atoi(buff)
				buff = ""
			}
		case ':':
			req = buff
			buff = ""
		default:
			buff = buff + string(line[i])
		}
	}
	reqCount := strings.Count(buff, req)
	return reqCount >= min && reqCount <= max
}

func validTobogganPolicy(line string) bool {
	idx1 := -1
	idx2 := -1
	req := byte(' ')
	var buff string
	for i := 0; i < len(line); i++ {
		if req != ' ' && line[i] != ' ' {
			buff = buff + string(line[i])
			continue
		}
		switch line[i] {
		case '-':
			idx1 = h.Atoi(buff)
			buff = ""
		case ' ':
			if idx2 == -1 {
				idx2 = h.Atoi(buff)
				buff = ""
			}
		case ':':
			req = line[i-1]
			buff = ""
		default:
			buff = buff + string(line[i])
		}
	}
	match1, match2 := buff[idx1-1] == req, buff[idx2-1] == req
	return match1 != match2
}
