package main

import (
	"bufio"
	"fmt"
	"log"
	"os"
)

func calcFuel(mass int) int {
	return (mass / 3) - 2
}

type Module struct {
	Mass int
}

func (m Module) RequiredFuel() (int, int) {
	base := calcFuel(m.Mass)
	var extra int
	e := calcFuel(base)
	for e >= 0 {
		extra += e
		e = calcFuel(e)
	}
	return base, extra
}

type ModuleStack []Module

func (ms ModuleStack) RequiredFuel() (int, int) {
	var base, extra int
	for _, m := range ms {
		b, e := m.RequiredFuel()
		base += b
		extra += e
	}
	return base, extra
}

func main() {
	input, err := os.Open("input.txt")
	if err != nil {
		log.Fatal(fmt.Errorf("could not open input file: %w", err))
	}
	defer input.Close()

	var stack ModuleStack
	scanner := bufio.NewScanner(input)
	for scanner.Scan() {
		var mass int
		fmt.Sscanf(scanner.Text(), "%d", &mass)
		stack = append(stack, Module{
			Mass: mass,
		})
	}
	if err := scanner.Err(); err != nil {
		log.Fatal(fmt.Errorf("error while scanning input: %w", err))
	}

	b, e := stack.RequiredFuel()
	log.Printf("required fuel: %d, %d => %d", b, e, b+e)
}