#!/usr/bin/env python
# -*- coding: utf-8 -*-
# This file is part of ROBOTGAME
#
# ROBOTGAME is free software: you can redistribute it and/or modify it under the
# terms of the GNU General Public License as published by the Free Software
# Foundation, either version 3 of the License, or (at your option) any later
# version.
#
# ROBOTGAME is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
# A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along with
# ROBOTGAME.  If not, see .
#
# ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '
#
#                         colourboxes.py
#                     --------------------
#       date created : Wed Aug 8 2012
#          copyright : (C) 2012 Niels G. W. Serup
#      maintained by : Niels G. W. Serup 
"""
Colour boxes.
"""
import random
def generate_colour_boxes(nwells, nboxes):
    """
    Generate colour boxes that can be used to make all wells white.
    Arguments:
    nwells -- number of wells
    nboxes -- maximum number of boxes needed to make all wells white.
    Return [[(r, g, b)]]
      where r : 0|1,  g : 0|1,  b : 0|1
    """
    
    nbits = nwells * 3
    data = [[0 for _ in range(nboxes)] for _ in range(nbits)]
    def insert_1():
        t = random.randrange(0, nboxes)
        for y in range(t, nboxes) + range(0, t):
            if data[x][y] == 0:
                data[x][y] = 1
                break
    for x in range(len(data)):
        insert_1()
        for _ in range(random.randrange(0, (nboxes + 1) / 2)):
            insert_1()
            insert_1()
    boxes = []
    for y in range(nboxes):
        box = []
        boxes.append(box)
        for x in range(0, nbits, 3):
            r = data[x][y]
            g = data[x + 1][y]
            b = data[x + 2][y]
            box.append((r, g, b))
    return boxes
def generate_random_box(nwells):
    r = lambda: random.choice((0, 1))
    return [(r(), r(), r()) for _ in range(nwells)]
def get_colours(boxes):
    colours = []
    for i in range(len(boxes[0])):
        r, g, b = boxes[0][i]
        for j in range(1, len(boxes)):
            r1, g1, b1 = boxes[j][i]
            r ^= r1
            g ^= g1
            b ^= b1
        colours.append((r, g, b))
    return colours
def makes_all_wells_white(boxes):
    """
    Determine if the boxes make all wells white when XOR'ed together.
    """
    return all(c == 1 for c in itertools.chain(*get_colours(boxes)))