#!python

from itertools import chain
from optparse import OptionParser
import sys

from tilecloud import BoundingPyramid, TileStore, consume
from tilecloud.store.boundingpyramid import BoundingPyramidTileStore
from tilecloud.store.mask import MaskTileStore


def main(argv):
    option_parser = OptionParser()
    option_parser.add_option("--bounds", metavar="BOUNDS")
    option_parser.add_option("--limit", metavar="LIMIT", type=int)
    option_parser.add_option("--output", metavar="FILENAME")
    option_parser.add_option("-z", metavar="Z", type=int)
    options, args = option_parser.parse_args(argv[1:])
    assert options.output
    assert options.z
    tilestores = map(TileStore.load, args)
    if options.bounds:
        bounding_pyramid = BoundingPyramid.from_string(options.bounds)
    else:
        bounding_pyramid_tilestore = BoundingPyramidTileStore()
        tilestream = chain.from_iterable(ts.list() for ts in tilestores)
        tilestream = bounding_pyramid_tilestore.put(tilestream)
        consume(tilestream, options.limit)
        bounding_pyramid = bounding_pyramid_tilestore.get_bounding_pyramid()
    mask_tilestore = MaskTileStore(options.z, bounding_pyramid.zget(options.z))
    tilestream = chain.from_iterable(ts.list() for ts in tilestores)
    tilestream = mask_tilestore.put(tilestream)
    consume(tilestream, options.limit)
    mask_tilestore.save(options.output, "PNG")


if __name__ == "__main__":
    sys.exit(main(sys.argv))
