# See LICENSE for licensing information.
#
# Copyright (c) 2016-2019 Regents of the University of California and The Board
# of Regents for the Oklahoma Agricultural and Mechanical College
# (acting for and on behalf of Oklahoma State University)
# All rights reserved.
#
from enum import Enum
from vector3d import vector3d

class direction(Enum):
    NORTH = 1
    SOUTH = 2
    EAST = 3
    WEST = 4
    UP = 5
    DOWN = 6
    NORTHEAST = 7
    NORTHWEST = 8
    SOUTHEAST = 9
    SOUTHWEST = 10


    def get_offset(direct):
        """ 
        Returns the vector offset for a given direction.
        """
        if direct==direction.NORTH:
            offset = vector3d(0,1,0)
        elif direct==direction.SOUTH:
            offset = vector3d(0,-1,0)
        elif direct==direction.EAST:
            offset = vector3d(1,0,0)
        elif direct==direction.WEST:
            offset = vector3d(-1,0,0)
        elif direct==direction.UP:
            offset = vector3d(0,0,1)
        elif direct==direction.DOWN:
            offset = vector3d(0,0,-1)
        elif direct==direction.NORTHEAST:
            offset = vector3d(1,1,0)
        elif direct==direction.NORTHWEST:
            offset = vector3d(-1,1,0)
        elif direct==direction.SOUTHEAST:
            offset = vector3d(1,-1,0)
        elif direct==direction.SOUTHWEST:
            offset = vector3d(-1,-1,0)
        else:
            debug.error("Invalid direction {}".format(direct))

        return offset

    def cardinal_directions(up_down_too=False):
        temp_dirs = [direction.NORTH, direction.EAST, direction.SOUTH, direction.WEST]
        if up_down_too:
            temp_dirs.extend([direction.UP, direction.DOWN])
        return temp_dirs
    
    def cardinal_offsets(up_down_too=False):
        return [direction.get_offset(d) for d in direction.cardinal_directions(up_down_too)]

    def all_directions():
        return [direction.NORTH, direction.EAST, direction.SOUTH, direction.WEST,
                direction.NORTHEAST, direction.NORTHWEST, direction.SOUTHEAST, direction.SOUTHWEST]
    
    def all_offsets():
        return [direction.get_offset(d) for d in direction.all_directions()]

    def all_neighbors(cell):
        return [cell+x for x in direction.all_offsets()]

    def cardinal_neighbors(cell):
        return [cell+x for x in direction.cardinal_offsets()]
    
