package main

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

func main() {
	args := os.Args[1:]
	input, err := helper.GetInput(args[0])
	var results []int
	var resultsPart2 []int
	if err != nil {
		fmt.Println(err)
	}
	for _, val := range input{
		results = append(results,calculateFormel(val,calculateFormelPart))
		resultsPart2 = append(resultsPart2,calculateFormel(val,calculateFormelPartPart2))
	}
	sum := 0
	sumPart2 := 0
	for _, val := range results{
		sum += val
	}
	for _, val := range resultsPart2{
		sumPart2 += val
	}
	fmt.Println(sum)
	fmt.Println(sumPart2)
}

func calculateFormel(formel string, formelPartFunc func(formel string) int) int{
	cleanFormel := strings.ReplaceAll(formel," ","")
	var formelParts []string
	result := 0
	for result == 0 {
		r, _ := regexp.Compile("\\([0-9+\\-*]*\\)")
		formelParts = r.FindAllString(cleanFormel, -1)
		if len(formelParts) > 0 {
			for _, part := range formelParts {
				result := strconv.Itoa(formelPartFunc(part))
				cleanFormel = strings.Replace(cleanFormel,part,result,-1)
			}
		}else {
			result = formelPartFunc(cleanFormel)
		}
	}
	return result
}

func calculateFormelPart (formel string) int{
	cleanFormel := strings.ReplaceAll(formel,"(","")
	cleanFormel = strings.ReplaceAll(cleanFormel,")","")
	r, _ := regexp.Compile("[ +*\\-]?[0-9]*")
	formelParts := r.FindAllString(cleanFormel, -1)
	sum, _ := strconv.Atoi(formelParts[0])
	for i:= 1; i< len(formelParts); i++{
		number, _ := strconv.Atoi(formelParts[i][1:])
		if formelParts[i][0] == '+' {
			sum += number
		}
		if formelParts[i][0] == '-' {
			sum -= number
		}
		if formelParts[i][0] == '*' {
			sum *= number
		}
	}
	return sum
}

func calculateFormelPartPart2 (formel string) int{
	cleanFormel := strings.ReplaceAll(formel,"(","")
	cleanFormel = strings.ReplaceAll(cleanFormel,")","")
	formelParts := strings.Split(cleanFormel,"*")
	var formelPartsSum []int
	for _, part := range formelParts {
		formelPartsSum = append(formelPartsSum,calculateFormelPart(part))
	}
	product := 1
	for _, multiplier := range formelPartsSum {
		product *= multiplier
	}
	return product
}


func sortOperation(a,b int) bool {
	return true
}

func sortOperationsPart2(a,b string) bool {
	if a[0] == '+' | '-' {
		return true
	}else{
		return false
	}
}

func split(r rune) bool{
	return r == '(' || r== ')'
}
