import shared
import matrix
import numpy as np
from scanf import scanf

def instruction_parse_p1(mx, inst):
    if inst.startswith("turn"):
        d, x1,y1, x2,y2 = scanf("turn %s %d,%d through %d,%d", inst)
        x2+=1 # inclusive
        y2+=1
        if d == 'on':
            mx[y1:y2,x1:x2] = 1
        if d == 'off':
            mx[y1:y2,x1:x2] = 0
    elif inst.startswith("toggle"):
        x1,y1, x2,y2 = scanf("toggle %d,%d through %d,%d", inst)
        x2+=1
        y2+=1
        mx[y1:y2,x1:x2] ^= 1

def instruction_parse_p2(mx, inst):
    if inst.startswith("turn"):
        d, x1,y1, x2,y2 = scanf("turn %s %d,%d through %d,%d", inst)
        if d == 'on':
            dx = 1
        if d == 'off':
            dx = -1

        mx[y1:y2+1,x1:x2+1] += dx
        mx[mx<0] = 0

    elif inst.startswith("toggle"):
        x1,y1, x2,y2 = scanf("toggle %d,%d through %d,%d", inst)
        dx = 2
        mx[y1:y2+1,x1:x2+1] += dx
    #mx[mx < 0] = 0


def pt1(instructions):
    mx = np.array(matrix.matrix_of_size(1001,1001))
    for inst in instructions:
        instruction_parse_p1(mx, inst)
    print(count(mx))

def pt2(instructions):
    mx = np.array(matrix.matrix_of_size(1000,1000))
    for inst in instructions:
        instruction_parse_p2(mx, inst)
    print(_sum(mx))

def count(mx):
    flat = np.ravel(mx).tolist()
    total = len([x for x in flat if x])
    return total

def _sum(mx):
    flat = [x for x in np.ravel(mx).tolist() if x]
    return sum(flat)

def main():
    with open(shared.get_fname(6), "r") as f:
        inp = [x.rstrip() for x in f.readlines()]
    pt1(inp)
    pt2(inp)
    print("=17836115")

if __name__ == "__main__":
    main()
