import PropTypes from 'prop-types'
import { connect } from 'react-redux'
import { compose, onlyUpdateForKeys, lifecycle } from 'recompose'
import { setVariableParamsAsync as setVariableEncounterParamsAsync } from '../redux/actions/encounters'
import threeEntryPoint from '../threejs/dungeon/threeEntryPoint'
import EventBus from 'eventing-bus'
import { initializeMonsters } from '../utility/helperFunctions'

class DMView extends React.Component {
	// componentShouldUpdate(prevProps) { 	return prevProps.partyAgent.coords !==
	// this.props.partyAgent.coords }
	componentDidUpdate(prevProps) {
		//console.log(this.props)
		if (prevProps.partyAgent.coords !== this.props.partyAgent.coords) {
			EventBus.publish(`setCoords`, this.props.partyAgent.coords)
		}
		if (prevProps.walls !== this.props.walls) {
			EventBus.publish(`setWalls`, this.props.walls)
		}
		// if (prevProps.dungeons !== this.props.dungeons) {
		// EventBus.publish(`setDungeons`, this.props.dungeons) } if (prevProps.walls
		// !== this.props.walls) {  EventBus.publish(`setWalls`, this.props.walls) } if
		// (prevProps.floor !== this.props.floor) {  EventBus.publish(`setFloor`,
		// this.props.floor) }
	}
	// componentDidUpdate(prevProps) {
	// 	const { dungeon } = this.props.partyAgent.coords
	// 	if (dungeon !== prevProps.partyAgent.coords.dungeon) {
	// 		console.log(`re-render...`)
	// 		threeEntryPoint({
	// 			container: this.threeRootElement,
	// 			encounters,
	// 			dungeons,
	// 			walls,
	// 			floor,
	// 			partyAgent,
	// 		})
	// 	}
	// }
	componentWillUnmount() {
		// window.location.reload(true)
		//EventBus.publish(`dismountScene`)
	}
	async componentDidMount() {
		const {
			dungeons,
			walls,
			floor,
			partyAgent,
			encounters,
			monsters,
			setVariableEncounterParamsAsync,
		} = this.props
		console.log(`DMView did mount`)
		threeEntryPoint({
			container: this.threeRootElement,
			encounters,
			dungeons,
			walls,
			floor,
			partyAgent,
		})

		const encounterData = encounters[partyAgent.coords.dungeon]

		const encounterSchemaKeys = Object.keys(encounterData).filter((key) => key[0] === `x`)

		const encounterSchemas = encounterSchemaKeys.reduce((acc, x) => {
			acc[x] = encounterData[x]
			return acc
		}, {})

		let uniqueEids = []
		const uniqueEncounterSchemaValues = Object.values(encounterSchemas).filter((schema) => {
			if (!uniqueEids.includes(schema.id)) {
				uniqueEids.push(schema.id)
				return true
			} else {
				return false
			}
		})
		console.log(uniqueEncounterSchemaValues)

		for (let uniqueSchema of uniqueEncounterSchemaValues) {
			//console.log(`monsterTypeQuantityPairs: `, monsterTypeQuantityPairs)

			if (
				!encounterData[uniqueSchema.id] ||
				encounterData[uniqueSchema.id].spawnedAt < Date.now() - 3000
			) {
				const monsterParams = {
					monstersDead: {},
					monsters: initializeMonsters({
						probabilityTable: encounters.__types[uniqueSchema.type],
						monstersTable: monsters,
					}),
				}
				await setVariableEncounterParamsAsync({
					dungeon: partyAgent.coords.dungeon,
					id: uniqueSchema.id,
					spawnedAt: Date.now(),
					...monsterParams,
				})
				const encounterCoords = encounterSchemaKeys.filter(
					(key) => encounterSchemas[key].id === uniqueSchema.id
				)
				EventBus.publish(`spawnEncounter`, {
					coords: encounterCoords,
					monsters: Object.keys(monsterParams.monsters),
					eid: uniqueSchema.id,
				})
				console.log(`spawned ${uniqueSchema.id}`)
			}
		}
	}
	render() {
		return (
			<div
				style={{
					display: `flex`,
				}}
			>
				{typeof window !== undefined && (
					<div
						style={{
							width: `100%`,
						}}
						ref={(el) => (this.threeRootElement = el)}
					/>
				)}
			</div>
		)
	}
}

DMView.propTypes = {}
const mapStateToProps = (state) => ({
	walls: state.walls,
	floor: state.floor,
	partyAgent: state.partyAgent,
	dungeons: state.dungeons,
	encounters: state.encounters,
	monsters: state.monsters,
})

const enhance = compose(connect(mapStateToProps, { setVariableEncounterParamsAsync }))

//componentDidMount onlyUpdateForKeys([``]), connect(mapStateToProps, {})

export default enhance(DMView)
