package main

import (
	"../helper"
	"fmt"
	"os"
	"regexp"
	"strconv"
	"strings"
)

func main() {
	args := os.Args[1:]
	input, err := helper.GetFile(args[0])
	if err != nil {
		fmt.Println(err)
	}
	reqFields := []string{"byr:", "iyr:", "eyr:", "hgt:", "hcl:", "ecl:", "pid:"}
	documents := strings.Split(input, "\n\n")
	count := 0
	countPart2 := 0
	for _, document := range documents {
		if isValid(document, reqFields) {
			count++
			if isValidPart2(document) {
				countPart2++
			}
		}
	}
	fmt.Println(count)
	fmt.Println(countPart2)
}

func isValid(document string, reqFields []string) bool {
	for _, reqField := range reqFields {
		match, err := regexp.MatchString(reqField, document)
		if err != nil {
			fmt.Println(err)
		}
		if !match {
			return false
		}
	}
	return true
}

func isValidPart2(document string) bool {
	fields := strings.Fields(document)
	for i := 0; i < len(fields); i++ {
		field := fields[i]
		pair := strings.Split(field, ":")
		switch pair[0] {
		case "byr":
			if !checkYear(pair[1], 2002, 1920) {
				return false
			}
		case "iyr":
			if !checkYear(pair[1], 2020, 2010) {
				return false
			}
		case "eyr":
			if !checkYear(pair[1], 2030, 2020) {
				return false
			}
		case "hgt":
			r, _ := regexp.Compile("(cm|in)")
			switch r.FindString(pair[1]) {
			case "cm":
				if !checkYear(pair[1][:len(pair[1])-2], 193, 150) {
					return false
				}
			case "in":
				if !checkYear(pair[1][:len(pair[1])-2], 76, 59) {
					return false
				}
			default:
				return false
			}
		case "hcl":
			if match, _ := regexp.MatchString("^#[a-f0-9]{6}", pair[1]); !match{
				return false
			}
		case "ecl":
			if match, _ := regexp.MatchString(pair[1], "amb blue brn gry grn hzl oth"); !match{
				return false
			}
		case "pid":
			if match, _ := regexp.MatchString("^[0-9]{8}$", pair[1]); !match{
				return false
			}
		}
	}
	return true
}

func checkYear(year string, max int, min int) bool {
	number, err := strconv.Atoi(year)
	return err == nil && number >= min && number <= max
}
