from contextlib import contextmanager
import time
import json

from binpack2 import Packer
import numpy as np 
from PIL import Image
import pandas as pd 

@contextmanager
def timing(message='operation'):
    then = time.time()
    yield
    elapsed = time.time() - then
    print('{} completed in {:.4f}s'.format(message, elapsed))

if __name__ == '__main__':
    PATH = 'D20170611T205930_IFCB010_roisizes.json'

    with open(PATH) as fin:
        roisizes = json.load(fin)

    roisizes = pd.DataFrame.from_dict(roisizes)
    roisizes['area'] = roisizes['width'] * roisizes['height']
    roisizes = roisizes.sort_values('area', ascending=False)

    print('loaded {} rectangles'.format(len(roisizes['targetNumber'])))

    with timing('compilation'):
        packer = Packer(1000,1000)
        packer.add_rect(10, 10, 1)

    done = set()
    need_more_pages = True

    page = 0

    with timing('run'):
        while need_more_pages:
            need_more_pages = False
            page += 1

            out = np.zeros((2048, 2048), dtype=np.uint8)
            packer = Packer(out.shape[0], out.shape[1])

            for t in roisizes.itertuples():
                if t.targetNumber in done:
                    continue
                w, h = t.width, t.height

                x, y = packer.add_rect(w, h, t.targetNumber)
                if x != -1 and y != -1:
                    done.add(t.targetNumber)
                    color = ((t.targetNumber * 37) % 127) + 127
                    out[x:x+w,y:y+h] = color
                else:
                    need_more_pages = True

            print('did page {}'.format(page))
            Image.fromarray(out).save('page{:02d}.png'.format(page))