import ListReader from './ListReader';
import ListReaderWithRed from './ListReaderWithRed';
import ReduxListReader from './ReduxListReader';
import { update as updateStore } from '../store';

const l = n => `${ n }List`;
const c = n => `${ n }Count`;
const ln = n => `${ n }ListNow`;
const rcn = n => `${ n }RedCountNow`;

const entityNamesWithRed = [ "log", "resource", "fetch", "stack" ];
const entityNamesSimple = [ "event", "profile" ];
const entityNames = /*[ "redux" ].*/entityNamesWithRed.concat(entityNamesSimple);

const is = {};
entityNames.forEach(n => {
	is[ l(n) ] = [];
	is[ c(n) ] = 0;
	is[ ln(n) ] = [];
	if (entityNamesWithRed.includes(n)) {
		is[ rcn(n) ] = 0;
	}
});
//is["reduxState"] = {};
//is["reduxFinalStates"] = [];


const createCallback = n => {
	const entityfy = s => `${ n }${ s[ 0 ].toUpperCase() }${ s.slice(1) }`;
	return state => {
		if (!state) return;
		const namedState = {};
		Object.keys(state).forEach(key => {
			namedState[ entityfy(key) ] = state[ key ];
		});
		return updateStore(namedState);
	}
}

let readers = null;

export function init(lists) {
	readers = {};
	entityNamesSimple.forEach(n => readers[ n ] = new ListReader(createCallback(n)));
	entityNamesWithRed.forEach(n => readers[ n ] = new ListReaderWithRed(createCallback(n)));
	//readers.redux = new ReduxListReader(createCallback("redux"));
	entityNames.forEach(n => readers[ n ].list = lists[ n ] || []);
}
export function append(name, item) {
	readers[ name ].append(item);
}
export function setStartTime(time) {
	readers.resource.startTime = time;
}
const byTimeNames = [ "event", "stack" ]; // TEMP
const byIndexNames = entityNames.filter(n => !byTimeNames.includes(n));
export function goTo(time, index) {
	if (readers === null) return;
	if (typeof index === 'number') {
		byTimeNames.forEach(n => readers[ n ] && readers[ n ]._callback(readers[ n ].goTo(time)));
		byIndexNames.forEach(n => readers[ n ] && readers[ n ]._callback(readers[ n ].goToIndex(index)));
	} else {
		entityNames.forEach(n => readers[ n ] && readers[ n ]._callback(readers[ n ].goTo(time)));
	}
}
export function clean() {
	entityNames.forEach(n => delete readers[ n ]);
}
export const INITIAL_STATE = is;
