/**
 * @license
 * Copyright Daniel Imms <http://www.growingwiththeweb.com>
 * Released under MIT license:
 *
 * The MIT License (MIT)
 *
 * Copyright (c) 2016 Daniel Imms, http://www.growingwiththeweb.com
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 *
 * Modified by Jackson Kearl <Microsoft/t-jakea@microsoft.com>
 */

/**
 * Represents a node in the binary tree, which has a key and a value, as well as left and right subtrees
 */
export class Node<K, V> {
	public left: Node<K, V> = null;
	public right: Node<K, V> = null;
	public height: number = null;

	/**
	 * Creates a new AVL Tree node.
	 * @param key The key of the new node.
	 * @param value The value of the new node.
	 */
	constructor(public key: K, public value: V) {}

	/**
	 * Convenience function to get the height of the left child of the node,
	 * returning -1 if the node is null.
	 * @return The height of the left child, or -1 if it doesn't exist.
	 */
	public get leftHeight(): number {
		if (!this.left) {
			return -1;
		}
		return this.left.height;
	}

	/**
	 * Convenience function to get the height of the right child of the node,
	 * returning -1 if the node is null.
	 * @return The height of the right child, or -1 if it doesn't exist.
	 */
	public get rightHeight(): number {
		if (!this.right) {
			return -1;
		}
		return this.right.height;
	}

	/**
	 * Performs a right rotate on this node.
	 * @return The root of the sub-tree; the node where this node used to be.
	 */
	public rotateRight(): Node<K, V> {
		//     b                           a
		//    / \                         / \
		//   a   e -> b.rotateRight() -> c   b
		//  / \                             / \
		// c   d                           d   e
		const other = this.left;
		this.left = other.right;
		other.right = this;
		this.height = Math.max(this.leftHeight, this.rightHeight) + 1;
		other.height = Math.max(other.leftHeight, this.height) + 1;
		return other;
	}

	/**
	 * Performs a left rotate on this node.
	 * @return The root of the sub-tree; the node where this node used to be.
	 */
	public rotateLeft(): Node<K, V> {
		//   a                              b
		//  / \                            / \
		// c   b   -> a.rotateLeft() ->   a   e
		//    / \                        / \
		//   d   e                      c   d
		const other = this.right;
		this.right = other.left;
		other.left = this;
		this.height = Math.max(this.leftHeight, this.rightHeight) + 1;
		other.height = Math.max(other.rightHeight, this.height) + 1;
		return other;
	}
}

export type DistanceFunction<K> = (a: K, b: K) => number;
export type CompareFunction<K> = (a: K, b: K) => number;

/**
 * Represents how balanced a node's left and right children are.
 */
const enum BalanceState {
	/** Right child's height is 2+ greater than left child's height */
	UNBALANCED_RIGHT,
	/** Right child's height is 1 greater than left child's height */
	SLIGHTLY_UNBALANCED_RIGHT,
	/** Left and right children have the same height */
	BALANCED,
	/** Left child's height is 1 greater than right child's height */
	SLIGHTLY_UNBALANCED_LEFT,
	/** Left child's height is 2+ greater than right child's height */
	UNBALANCED_LEFT
}

export class NearestNeighborDict<K, V> {
	public static NUMERIC_DISTANCE_FUNCTION = (a: number, b: number) => (a > b ? a - b : b - a);
	public static DEFAULT_COMPARE_FUNCTION = (a: any, b: any) => (a > b ? 1 : a < b ? -1 : 0);

	protected root: Node<K, V> = null;

	/**
	 * Creates a new AVL Tree.
	 */
	constructor(
		start: Node<K, V>,
		private distance: DistanceFunction<K>,
		private compare: CompareFunction<K> = NearestNeighborDict.DEFAULT_COMPARE_FUNCTION
	) {
		this.insert(start.key, start.value);
	}

	public height() {
		return this.root.height;
	}

	/**
	 * Inserts a new node with a specific key into the tree.
	 * @param key The key being inserted.
	 * @param value The value being inserted.
	 */
	public insert(key: K, value?: V): void {
		this.root = this._insert(key, value, this.root);
	}

	/**
	 * Gets a node within the tree with a specific key, or the nearest neighbor to that node if it does not exist.
	 * @param key The key being searched for.
	 * @return The (key, value) pair of the node with key nearest the given key in value.
	 */
	public getNearest(key: K): Node<K, V> {
		return this._getNearest(key, this.root, this.root);
	}

	/**
	 * Inserts a new node with a specific key into the tree.
	 * @param key The key being inserted.
	 * @param root The root of the tree to insert in.
	 * @return The new tree root.
	 */
	private _insert(key: K, value: V, root: Node<K, V>): Node<K, V> {
		// Perform regular BST insertion
		if (root === null) {
			return new Node(key, value);
		}

		if (this.compare(key, root.key) < 0) {
			root.left = this._insert(key, value, root.left);
		} else if (this.compare(key, root.key) > 0) {
			root.right = this._insert(key, value, root.right);
		} else {
			return root;
		}

		// Update height and rebalance tree
		root.height = Math.max(root.leftHeight, root.rightHeight) + 1;
		const balanceState = this._getBalanceState(root);

		if (balanceState === BalanceState.UNBALANCED_LEFT) {
			if (this.compare(key, root.left.key) < 0) {
				// Left left case
				root = root.rotateRight();
			} else {
				// Left right case
				root.left = root.left.rotateLeft();
				return root.rotateRight();
			}
		}

		if (balanceState === BalanceState.UNBALANCED_RIGHT) {
			if (this.compare(key, root.right.key) > 0) {
				// Right right case
				root = root.rotateLeft();
			} else {
				// Right left case
				root.right = root.right.rotateRight();
				return root.rotateLeft();
			}
		}

		return root;
	}

	/**
	 * Gets a node within the tree with a specific key, or the node closest (as measured by this._distance)
	 * to that node if the key is not present
	 * @param key The key being searched for.
	 * @param root The root of the tree to search in.
	 * @param closest The current best estimate of the node closest to the node being searched for,
	 * as measured by this._distance
	 * @return The (key, value) pair of the node with key nearest the given key in value.
	 */
	private _getNearest(key: K, root: Node<K, V>, closest: Node<K, V>): Node<K, V> {
		const result = this.compare(key, root.key);
		if (result === 0) {
			return root;
		}

		closest = this.distance(key, root.key) < this.distance(key, closest.key) ? root : closest;

		if (result < 0) {
			return root.left ? this._getNearest(key, root.left, closest) : closest;
		} else {
			return root.right ? this._getNearest(key, root.right, closest) : closest;
		}
	}

	/**
	 * Gets the balance state of a node, indicating whether the left or right
	 * sub-trees are unbalanced.
	 * @param node The node to get the difference from.
	 * @return The BalanceState of the node.
	 */
	private _getBalanceState(node: Node<K, V>): BalanceState {
		const heightDifference = node.leftHeight - node.rightHeight;
		switch (heightDifference) {
			case -2:
				return BalanceState.UNBALANCED_RIGHT;
			case -1:
				return BalanceState.SLIGHTLY_UNBALANCED_RIGHT;
			case 1:
				return BalanceState.SLIGHTLY_UNBALANCED_LEFT;
			case 2:
				return BalanceState.UNBALANCED_LEFT;
			case 0:
				return BalanceState.BALANCED;
			default: {
				console.error('Internal error: Avl tree should never be more than two levels unbalanced');
				if (heightDifference > 0) {
					return BalanceState.UNBALANCED_LEFT;
				}
				if (heightDifference < 0) {
					return BalanceState.UNBALANCED_RIGHT;
				}
			}
		}
	}
}
