'use strict';
var isPlainObj = require('is-plain-obj');
module.exports = function (obj, opts) {
	if (!isPlainObj(obj)) {
		throw new TypeError('Expected a plain object');
	}
	opts = opts || {};
	// DEPRECATED
	if (typeof opts === 'function') {
		opts = {compare: opts};
	}
	var deep = opts.deep;
	var seenInput = [];
	var seenOutput = [];
	var sortKeys = function (x) {
		var seenIndex = seenInput.indexOf(x);
		if (seenIndex !== -1) {
			return seenOutput[seenIndex];
		}
		var ret = {};
		var keys = Object.keys(x).sort(opts.compare);
		seenInput.push(x);
		seenOutput.push(ret);
		for (var i = 0; i < keys.length; i++) {
			var key = keys[i];
			var val = x[key];
			ret[key] = deep && isPlainObj(val) ? sortKeys(val) : val;
		}
		return ret;
	};
	return sortKeys(obj);
};