'''MCEditForester.py
   Tree-generating script by dudecon
   http://www.minecraftforum.net/viewtopic.php?f=1022&t=219461

   Needs the dummy mcInterface for MCEdit, and the default Forester script.
'''

from pymclevel.materials import alphaMaterials
import Forester

displayName = "Forester"

libraries = [
             {
              "name": "mcInterface",
              "path": "Bundled Libraries<sep>mcInterface.py",
              "URL": "None",
              "optional": False,
             }
            ]

inputs = (
    ("Forester script by dudecon", "label"),
    ("Shape", ("Procedural",
               "Normal",
               "Bamboo",
               "Palm",
               "Stickly",
               "Round",
               "Cone",
               "Rainforest",
               "Mangrove",
    )),

    ("Tree Count", 2),
    ("Tree Height", 35),
    ("Height Variation", 12),

    ("Branch Density", 1.0),
    ("Trunk Thickness", 1.0),
    ("Broken Trunk", False),
    ("Hollow Trunk", False),
    ("Wood", True),

    ("Foliage", True),
    ("Foliage Density", 1.0),

    ("Roots", ("Yes", "To Stone", "Hanging", "No")),
    ("Root Buttresses", False),

    ("Wood Material", alphaMaterials.Wood),
    ("Leaf Material", alphaMaterials.Leaves),
    ("Plant On", alphaMaterials.Grass),

)


def perform(level, box, options):
    import mcInterface
    '''Load the file, create the trees, and save the new file.
    '''
    # Set up a reversed translation handler for the Shape and Roots options.
    reverse_trn = {}
    for value in (inputs[1][1] + inputs[12][1]):
        reverse_trn[trn.string_cache.get(value, value)] = value
    # set up the non 1 to 1 mappings of options to Forester global names
    optmap = {
        "Tree Height": "CENTERHEIGHT",
    }
    # automatically set the options that map 1 to 1 from options to Forester

    def setOption(opt):
        OPT = optmap.get(opt, opt.replace(" ", "").upper())
        if OPT in dir(Forester):
            val = reverse_trn.get(options[opt], options[opt])
            if isinstance(val, (str, unicode)):
                val = val.replace(" ", "").lower()

            setattr(Forester, OPT, val)

    # set all of the options
    for option in options:
        setOption(option)
    # set the EDGEHEIGHT the same as CENTERHEIGHT
    Forester.EDGEHEIGHT = Forester.CENTERHEIGHT
    # set the materials
    wood = options["Wood Material"]
    leaf = options["Leaf Material"]
    grass = options["Plant On"]

    Forester.WOODINFO = {"B": wood.ID, "D": wood.blockData}
    Forester.LEAFINFO = {"B": leaf.ID, "D": leaf.blockData}
    Forester.PLANTON = [grass.ID]

    # calculate the plant-on center and radius
    x_center = int(box.minx + (box.width / 2))
    z_center = int(box.minz + (box.length / 2))
    edge_padding = int(Forester.EDGEHEIGHT * 0.618)
    max_dim = min(box.width, box.length)
    planting_radius = (max_dim / 2) - edge_padding
    if planting_radius <= 1:
        planting_radius = 1
        Forester.TREECOUNT = 1
        print("Box isn't wide and/or long enough. Only planting one tree.")
    # set the position to plant
    Forester.X = x_center
    Forester.Z = z_center
    Forester.RADIUS = planting_radius
    print("Plant radius = " + str(planting_radius))

    # set the Forester settings that are not in the inputs
    # and should be a specific value
    # take these out if added to settings
    Forester.LIGHTINGFIX = False
    Forester.MAXTRIES = 5000
    Forester.VERBOSE = True

    # create the dummy map object
    mcmap = mcInterface.MCLevelAdapter(level, box)
    # call forester's main function on the map object.
    Forester.main(mcmap)

    level.markDirtyBox(box)
