#!/usr/bin/python

from PIL import Image
import math
import numpy

def to24Bit(data):
    red = (data >> 5) * 32;
    green = ((data & 28) >> 2) * 32;
    blue = (data & 3) * 64;
    return [red, green, blue]

def to8Bit(pixel):
#    return (math.floor((pixel[0] / 32)) << 5) + (math.floor((pixel[1] / 32)) << 2) + math.floor((pixel[2] / 64))
     return (pixel[0] * 7 // 255) << 5 + (pixel[1] * 7 // 255) << 2 + (pixel[2] * 3 // 255)

images = ["house", "trees", "lake", "sky", "sheep", "snake"]
tileSize = 10


im = Image.open("Piet'ers Gallery_files/house.png")
pix = im.load()
numTiles = im.size[0] // tileSize

for y in range(im.size[1] - 2 * tileSize):
    line = ""
    for x in range(im.size[0] - 2 * tileSize):
        x_abs = x + tileSize
        y_abs = y + tileSize

        pixelX = min(math.floor(x_abs / tileSize) * tileSize + 5, im.size[0] - 5)
        pixelY = min(math.floor(y_abs / tileSize) * tileSize + 5, im.size[1] - 5)

        pixels = [
            pix[5, pixelY],
            pix[im.size[0] - 5, pixelY],
            pix[pixelX, 5],
            pix[pixelX, im.size[1] - 5]
        ]

        result = ((pixels[0] | pixels[1]) & (pixels[2] | pixels[3]))
        pix[x_abs, y_abs] = result

for tileY in range(numTiles):
    line = ""
    for tileX in range(numTiles):
        p = pix[tileX * tileSize + 5, tileY * tileSize + 5]
        # line += "%08d " % int(bin(p)[2:])
        line += chr(p)
    print(line)

im.save("test.png")

# def decodePixel(x, y, tileSize):
#     # x_abs = x*tileSize + tileSize // 2
#     # y_abs = y*tileSize + tileSize // 2
#     pixel = pix[x, y]
#
#     return pixel
    # return "%02d" % pixel
    # r = pixel[0]
    # g = pixel[1]
    # b = pixel[2]
    # bit8 = to8Bit(pixel)

    # return colors[pixel]
    # r = 1 if r == 192 else (10 if r == 255 else r)
    # g = 1 if g == 192 else (10 if g == 255 else g)
    # b = 1 if b == 192 else (10 if b == 255 else b)

    # return "%02d%02d%02d" % (r, g, b)
    # return "%02d" % pixel
    # return "%08d" % int(bin(bit8)[2:])

    # What to do with this pixel?
    # return bin(pixel)[2:]
    # return "%04d" % int(bin(pixel)[2:])
    # return str(chr(ord('A') + pixel))
    # return pix[x,y]

# for imageName in images:
#     im = Image.open("Piet'ers Gallery_files/%s.png" % imageName)
#     pix = im.load()
#
#     tileSize = 10
#     tilesW = im.size[0] // tileSize
#     tilesH = im.size[1] // tileSize
# #
#     data = []
#
#     # First row
#     for x in range(tilesW):
#         data.append(decodePixel(x, 0, tileSize))
#
#     # Column right
#     for y in range(1, tilesH - 1):
#         data.append(decodePixel(tilesW - 1, y, tileSize))
#
#     # Row bottom
#     for x in reversed(range(tilesW - 1)):
#         data.append(decodePixel(x, tilesH - 1, tileSize))
#
#     # Column left
#     for y in reversed(range(1, tilesH - 1)):
#         data.append(decodePixel(0, y, tileSize))
#
#     # print(''.join(data))
#     print(imageName, "\t", ' '.join(data))

# for
# im = Image.open("Piet'ers Gallery_files/lake.png")
# im = Image.open("Piet'ers Gallery_files/house_2.png")
# im = Image.frombytes('P', im.size, im.tobytes())

# for imageName in images:
#     im = Image.open("Piet'ers Gallery_files/%s.png" % imageName)
#     pix = im.load()
#
# tileSize = 10
# tilesW = im.size[0] // tileSize
# tilesH = im.size[1] // tileSize

    # for y in range(im.size[1] - 2 * tileSize):
    #     line = ""
    #     for x in range(im.size[0] - 2 * tileSize):
    #         x_abs = x + tileSize
    #         y_abs = y + tileSize
    #
    #         pixelX = min(math.floor(x_abs / tileSize) * tileSize + 5, im.size[0] - 5)
    #         pixelY = min(math.floor(y_abs / tileSize) * tileSize + 5, im.size[1] - 5)
    #
    #         pixels = [
    #             pix[5, pixelY],
    #             pix[im.size[0] - 5, pixelY],
    #             pix[pixelX, 5],
    #             pix[pixelX, im.size[1] - 5]
    #         ]
    #
    #         result = (pixels[0] ^ pixels[1] ^ pixels[2] ^ pixels[3]) % 18
            # line += str(result)
            #
            # print(pixels)

            # pixelX = 5 if (x_abs < im.size[0] // 2) else im.size[0] - 5
            # pixelY = 5 if (y_abs < im.size[1] // 2) else im.size[1] - 5

            # print("pixelX, pixelY", pixelX, pixelY, x, y)
            # print("asdas", x, y)
            # pixel1 = decodePixel(pixelX, , tileSize)
            # pixel2 = decodePixel(math.floor(x_abs / tileSize) * tileSize, pixelY, tileSize)

    #         pix[x_abs, y_abs] = result
    #     print(line)
    #
    # im.save("%s_decoded.png" % imageName)

# data = []
#
# # First row
# for x in range(tilesW):
#     data.append(decodePixel(x, 0))
#
# # Column right
# for y in range(1, tilesH - 1):
#     data.append(decodePixel(tilesW - 1, y))
#
# # Row bottom
# for x in reversed(range(tilesW - 1)):
#     data.append(decodePixel(x, tilesH - 1))
#
# # Column left
# for y in reversed(range(1, tilesH - 1)):
#     data.append(decodePixel(0, y))
# #
# print(''.join(data))
# print(len(''.join(data)))

# for x in range(tilesW):
#     data.append(decodePixel(x, 0))

# pixel = numpy.array(im)

# print(bin(pix[4*tileSize + 5,0]))

# data = [[0 for x in range(tilesW)] for y in range(tilesH)]

# for y in range(tilesH):
#     line = ""
#     for x in range(tilesW):
#         # pixel = im.getpixel((x * tileSize + 5, y * tileSize + 5))
#         pixel = pix[x * tileSize + 5, y * tileSize + 5]
#         # binary = bin(pixel)[2:]
#         # binaryStr = "%08d" % int(binary)
#         # line += binaryStr
#         # line += chr(ord('A') + pixel)
#         # data[x][y] = pixel
#         # line += chr(pixel)
#         # print(to24Bit(int(binaryStr[::-1], 2)))
#         # print(binaryStr, binary, chr(pixel))
#         # str = str + binaryStr
#         # str += binary
#         line += "%02d" % pixel
#     print(line)

# data[1][1] = data[0][1] + data[1][0]
# for x in range(1,tilesW//2 + 1):
#     data[x][1] = data[0][x] | data[1][0]
#     print(chr(ord('A') + data[x][1]))


# for y in range(1,tilesH):
#     pixel = pix[tilesW * tileSize - 5, y * tileSize + 5]
#     binary = bin(pixel)[2:]
#     binaryStr = "%08d" % int(binary)
#     str = str + binaryStr
#
# print(str)
#
# data = [
#     [255,192,255],
#     [255,0,255],
#     [0,255,255]
# ]
#
# print(' '.join(["%08d" % int(bin(to8Bit(p))[2:]) for p in data]))


# print(pix[5, 15], pix[5, 25], pix[5, 35], pix[5, 45], pix[5, 55])
