package day09

import (
	"adventofcode2024/utils"
	"fmt"
)

func Part1(input string) int {
	disk := []int{}
	file_id := 0
	for i := 0; i <= len(input); i++ {
		for x := 0; x < utils.MustAtoi(string(input[i])); x++ {
			disk = append(disk, file_id)
		}
		i++
		if i < len(input) {
			for x := 0; x < utils.MustAtoi(string(input[i])); x++ {
				disk = append(disk, -1)
			}
		}
		file_id++
	}
	
	printDisk(disk)

	for i:=len(disk)-1;i>0;i--{
		if disk[i] != -1 {
			id := disk[i]
			disk[i] = -1
			for j:=0;j<=len(disk);j++ {
				if disk[j] == -1 {
					disk[j] = id
					break
				}
			}
		}
	}
	printDisk(disk)

	checksum := 0
	for i:=0;i<len(disk);i++ {
		if disk[i] != -1 {
			checksum += i * disk[i]
		}
	}
	return checksum
}

func Part2(input string) int {
	disk := []int{}
	file_id := 0
	for i := 0; i <= len(input); i++ {
		for x := 0; x < utils.MustAtoi(string(input[i])); x++ {
			disk = append(disk, file_id)
		}
		i++
		if i < len(input) {
			for x := 0; x < utils.MustAtoi(string(input[i])); x++ {
				disk = append(disk, -1)
			}
		}
		file_id++
	}
	
	printDisk(disk)

	for i:=len(disk)-1;i>0;i--{
		size := 0
		if disk[i] != -1 {
			id := disk[i]
			for {
				if i-size > 0 && disk[i-size] == id {
					size++
				} else {
					break
				}
			}
			free := 0
			j := 0
			found := false
			for ;j<i && free < size;j++{
				if disk[j] != -1 { 
					free = 0
					continue 
				}
				free++
				if free == size { found = true }
			}
			if found {
				for k:=0;k<size;k++ {
					disk[i-k] = -1
					disk[j-size+k] = id
				}
//				printDisk(disk)
			}
			i -= (size -1)
			
		}
	}
	printDisk(disk)

	checksum := 0
	for i:=0;i<len(disk);i++ {
		if disk[i] != -1 {
			checksum += i * disk[i]
		}
	}
	return checksum}

func printDisk(disk []int) {
	for _, x := range disk {
		if x == -1 {fmt.Print(".")} else {
			fmt.Printf("%d", x)
		}
	}
	fmt.Print("\n")
}