/* @flow */

import React, { Component, createContext } from 'react'
import type { ComponentType } from 'react'

export type Tracker = {
	push: (Array<string>) => void,
	connectToHistory: Function
}
export const defaultTracker: Tracker = {
	push: console.log, // eslint-disable-line no-console
	connectToHistory: history => history
}
const TrackerContext = createContext(defaultTracker)

export const TrackerProvider = TrackerContext.Provider
export default function withTracker<Props: { tracker: Tracker }>(
	WrappedComponent: ComponentType<Props>
) {
	class WithTracker extends Component<$Diff<Props, { tracker: Tracker }>> {
		displayName = `withTracker(${WrappedComponent.displayName || ''})`
		render() {
			return (
				<TrackerContext.Consumer>
					{tracker => <WrappedComponent {...this.props} tracker={tracker} />}
				</TrackerContext.Consumer>
			)
		}
	}
	return WithTracker
}