package compiler

import "fmt"

type LabelStack struct {
	stack   []string
	counter int
	prefix  string
}

func NewLabelStack(prefix string) *LabelStack {
	return &LabelStack{
		stack:   make([]string, 0),
		counter: 0,
		prefix:  prefix,
	}
}

func (ls *LabelStack) Push() string {
	ls.counter++
	label := fmt.Sprintf("%s%d", ls.prefix, ls.counter)
	ls.stack = append(ls.stack, label)
	return label
}

func (ls *LabelStack) Peek() (string, error) {
	if len(ls.stack) == 0 {
		return "", fmt.Errorf("stack underflow: %s stack is empty", ls.prefix)
	}
	return ls.stack[len(ls.stack)-1], nil
}

func (ls *LabelStack) Pop() (string, error) {
	if len(ls.stack) == 0 {
		return "", fmt.Errorf("stack underflow: %s stack is empty", ls.prefix)
	}
	label := ls.stack[len(ls.stack)-1]
	ls.stack = ls.stack[:len(ls.stack)-1]
	return label, nil
}

func (ls *LabelStack) IsEmpty() bool {
	return len(ls.stack) == 0
}

func (ls *LabelStack) Size() int {
	return len(ls.stack)
}
