from pprint import pprint as pp
from shared import load_rows
from scanf import scanf
from string import ascii_letters
import re


def load_crates(x):
    done_crates = False
    crates = []
    instructions = []
    for row in x:
        if done_crates:
            instructions.append(row)
        else:
            if row == "":
                done_crates = True
            else:
                crates.append(row)
    crates.pop()
    return crates, instructions


def to_lists(crates):
    parsed = []
    reg = re.compile(r"[\([{})\]]")
    for row in crates:
        parsed.append([x for x in reg.sub(" ", row)])
    parsed = list(zip(*parsed[::-1]))
    parsed = list(zip(*parsed[::-1]))
    parsed = list(zip(*parsed[::-1]))
    cleaned1 = [[x for x in y if x.strip()] for y in parsed if y]
    cleaned2 = [x for x in cleaned1 if x != []][::-1]
    return cleaned2


def parse_instructions(crates, instructions):
    for instruction in instructions:
        count, _from, _to = scanf("move %d from %d to %d", instruction)
        print(count, _from, _to)
        _from -= 1  # 1 based yo
        _to -= 1
        for x in range(count):
            value = crates[_from].pop(0)
            crates[_to].insert(0, value)
    return crates


def parse_instructions_pt2(crates, instructions):
    for instruction in instructions:
        count, _from, _to = scanf("move %d from %d to %d", instruction)
        _from -= 1  # 1 based yo
        _to -= 1
        moving = crates[_from][:count]
        print(instruction, moving)
        for x in range(count):
            crates[_from].pop(0)
        for x in reversed(moving):
            crates[_to].insert(0, x)

    return crates


def part1(x):
    crates, instructions = load_crates(x)
    crates = to_lists(crates)
    crates = parse_instructions(crates, instructions)
    print([c[0] for c in crates])


def part2(x):
    crates, instructions = load_crates(x)
    crates = to_lists(crates)
    crates = parse_instructions_pt2(crates, instructions)
    print("".join([c[0] for c in crates]))


def main():
    rows = load_rows(5)
    # part1(rows)
    part2(rows)


if __name__ == "__main__":
    main()
