package main

import (
	"strconv"
	"strings"
)

type Stack []string

// used to create Stacks
func (st *Stack) Push(str string) {
	if str == "   " {
		return
	}
	*st = append(*st, str)
}

// used in actual moving of the data between stacks
func (st *Stack) MovePush(str string) {
	s := []string{str}
	*st = append(s, *st...)
}

func (st *Stack) Pop() string {
	length := len(*st)
	if length == 0 {
		return ""
	}
	str := (*st)[0]
	*st = (*st)[1:]
	return str
}

func parseInput(d []byte) []string {
	strs := strings.Split(string(d), "\n")
	strs = strs[:len(strs)-1]
	return strs
}

// helper function to neatly seprate each coloum into
// individual strings
func createSubArrarys(data []string) (newData [][]string) {
	newData = make([][]string, len(data))
	for i := 0; i < len(data); i++ {
		for j := 0; j < len(data[i]); j += 4 {
			newData[i] = append(newData[i], data[i][j:j+3])
		}
	}
	return
}

// create arry of integers from instrcution sentences
// since all sentences have the same form
// it is safe to parse line by line
func creatInstArray(d []byte) [][]int {
	strs := strings.Split(string(d), "\n")
	ints := make([][]int, len(strs))
	for idx, line := range strs {
		substrs := strings.Split(line, " ")
		for _, word := range substrs {
			converted, err := strconv.Atoi(word)
			if err == nil {
				ints[idx] = append(ints[idx], converted)
			}

		}
	}
	return ints
}

func createStacks(data [][]string) []Stack {
	stacks := make([]Stack, 9)
	for _, line := range data {
		for i := range line {
			stacks[i].Push(line[i])
		}
	}

	return stacks
}


func move(stacks []*Stack, insts []int) {
	for i := 1; i <= insts[0]; i++ {
		temp := stacks[insts[1]-1].Pop()
		stacks[insts[2]-1].MovePush(temp)
	}
}
func getTops(stacks []Stack, instructions [][]int) string {
	ptrStacks := []*Stack{}
	for i := 0; i < len(stacks); i++ {
		ptrStacks = append(ptrStacks, &stacks[i])
	}
	builder := strings.Builder{}
	replacer := strings.NewReplacer("[", "", "]", "")
	for _, i := range instructions {
		move(ptrStacks, i)
	}
	for _, i := range ptrStacks {
		builder.WriteString(replacer.Replace(i.Pop()))
	}
	return builder.String()
}
