import mercantile
import json

# This script prints the mercantile bounds needed for the generate_clusters script config.
# It loops through the zoom_levels and geojson provided in the following lines.
ENABLED_ZOOMS = { "14": {"distance": 8, "min-points": 1}, "11": {"distance": 15, "min-points": 2}, "9": {"distance": 100, "min-points": 2}, "7": {"distance": 250, "min-points": 2} }
GEOJSONS = { 
        "s06": {"type": "Polygon","coordinates": [[[-99.931641,36.527295],[-103.051758,36.527295],[-103.095703,32.026706],[-106.633301,31.989442],[-104.370117,29.363027],[-103.271484,28.88316],[-101.931152,29.726222],[-100.217285,28.07198],[-99.008789,26.175159],[-97.03125,25.740529],[-97.44873,27.000408],[-93.713379,29.42046],[-93.977051,31.989442],[-93.955078,33.706063],[-99.909668,34.633208],[-99.931641,36.527295]]]},
        "s09": {"type":"Polygon","coordinates":[[[-79.453125,1.950796],[-79.453125,1.950796],[-76.069336,0.632801],[-76.069336,0.632801],[-74.882813,-0.377926],[-74.882813,-0.377926],[-75.410156,-1.608186],[-75.410156,-1.608186],[-77.958984,-3.364275],[-77.958984,-3.364275],[-78.75,-4.985882],[-78.75,-4.985882],[-79.453125,-5.073434],[-79.453125,-5.073434],[-80.683594,-4.285061],[-80.683594,-4.285061],[-81.386719,-1.915658],[-81.386719,-1.915658],[-80.90332,0.413083],[-80.90332,0.413083],[-79.453125,1.950796]]]},
        "s15_s16": {"type":"Polygon","coordinates":[[[-13.447266,49.310799],[-13.447266,61.386198],[4.702148,61.386198],[4.702148,49.310799],[-13.447266,49.310799]]]},
        "s22": {"type":"Polygon","coordinates":[[[61.962891,6.162401],[61.962891,34.397845],[93.603516,34.397845],[93.603516,6.162401],[61.962891,6.162401]]]},
        "s23": {"type": "Polygon","coordinates": [[[81.156006,30.461933],[81.156006,30.461933],[81.661377,30.499805],[81.661377,30.499805],[82.122803,30.405097],[82.122803,30.405097],[88.286133,27.891524],[88.286133,27.891524],[88.143311,26.317052],[88.143311,26.317052],[87.341309,26.307204],[87.341309,26.307204],[85.231934,26.68084],[85.231934,26.68084],[81.870117,27.745774],[81.870117,27.745774],[79.936523,28.800397],[79.936523,28.800397],[80.310059,29.806331],[80.310059,29.806331],[81.156006,30.461933]]]},
        "s24_s25": {"type": "Polygon","coordinates": [[[103.666992,6.009459],[100.986328,5.134715],[98.129883,5.878332],[95.273438,13.923404],[97.03125,20.303418],[100.50293,21.412162],[105.424805,18.354526],[106.435547,13.453737],[104.765625,9.275622],[103.666992,6.009459]]]},
        "s29": {"type":"Polygon","coordinates":[[[106.040039,-44.668653],[106.040039,-8.037473],[159.873047,-8.037473],[159.873047,-44.668653],[106.040039,-44.668653]]]},
        "s30_s31": {"type":"Polygon","coordinates":[[[159.829102,-52.038977],[159.829102,-30.050077],[187.602539,-30.050077],[187.602539,-52.038977],[159.829102,-52.038977]]]}
}

def tiles(bounds, zoom):
        return mercantile.tiles(south=bounds.south, east=bounds.east, north=bounds.north, west=bounds.west, zooms=zoom)

def main():
        for database, geojson in GEOJSONS.items():
                print(f"\n\n\n================================================================ {database} ================================================================")
                # print(geojson)

                for zoom in reversed(range(0,16)):
                        if str(zoom) not in ENABLED_ZOOMS.keys():
                                continue
                        bounds = mercantile.geojson_bounds(geojson)
                        min_x = min([tile.x for tile in tiles(bounds, zoom)])
                        max_x =max([tile.x for tile in tiles(bounds, zoom)])
                        min_y = min([tile.y for tile in tiles(bounds, zoom)])
                        max_y =max([tile.y for tile in tiles(bounds, zoom)])

                        output = { "distance": ENABLED_ZOOMS[str(zoom)]['distance'], "min-points": ENABLED_ZOOMS[str(zoom)]['min-points'], "bounds_x": [min_x, max_x], "bounds_y": [min_y, max_y] }
                        print(f"databases.insar.{database}.clusters.{zoom}={json.dumps(output)}")
        
        print("\n\nCopy only the config you need - make sure you complete the distance and min-points for the zoom levels you copy.")

if __name__ == "__main__":
    main()
