Source: helpers.js

import { clone, get, isArray, find, set, snakeCase, camelCase } from 'lodash';
import ReactSync from './ReactSync';
const pluralize = require('pluralize');
import { on } from './Event';


/** */
export function ReactSyncData(){
	window[window.ReactSyncGlobal] = window[window.ReactSyncGlobal] || {};
	return window[window.ReactSyncGlobal];
}


/** */
export function snake_case(t){
	var t = clone(t) || '';
	return snakeCase(t);
/*

	(t.match(/[A-Z]/g) || []).forEach((l) => { t = t.replace(l, `_${l}`) })

	return t.replace(/^_/, '').toLowerCase();
*/
}

/** */
export function studly_case(t){
	var t = clone(t) || '';
	const camelized = camelCase(t);

	return camelized.slice(0,1).toUpperCase() + camelized.slice(1);
}

/** */
export function app_get(dotvalue, query){
	const ReactSyncAppData = ReactSyncData();
	if(typeof dotvalue === 'undefined' && typeof query === 'undefined'){
		return ReactSyncAppData.page_data;
	}
	let parentobjkey = dotvalue.split('.').slice(0,-1).join('.');
	let possible_id = dotvalue.split('.').slice(-1).toString();
	let parentarray;
	let data;
	if(typeof query === 'undefined' && possible_id !== "null" && isArray(ReactSyncAppData.page_data[parentobjkey])){
		return app_get(parentobjkey, possible_id);
	}
	data = get(ReactSyncAppData.page_data, dotvalue);

	if(query) {
		if(!isArray(query)) query = ['id', parseInt(query)];
		return find(data, query);
	}
	else return data;
}

window.appGet = app_get;

/** */
export function app_put(dotkey, value){
	const ReactSyncAppData = ReactSyncData();
	set(ReactSyncAppData.page_data, dotkey, value);
	return app_get(dotkey);
}

/** */
export function brackets_to_dots(value){
	return value.replace(/\[(.*?)\]/g, ".$1");
}

/** */
export function pluralToClassName(plural){
	return studly_case(pluralize.singular(plural));
};

/** */
export function classNameToPlural(class_name){
	return snake_case(pluralize(class_name));
}

/** */
export function isModel(n){
	return typeof schemas[n] !== "undefined";
}


/** */
export function app_current(){
	return new Promise((resolve, reject) => {
		on('react_sync_booted', resolve);
	});
}

/** */
export function def(obj, prop, callback){
	Object.defineProperty(obj, prop, {
		get: callback,
		set: function(){ return null; }
	});
}