export default class VuES6Loader {
	constructor(component_list) {
		this.components = component_list
	}

	load() {
		for ( const ComponentClass of Object.values(this.components) ) {
			const method_properties = Object.getOwnPropertyNames(ComponentClass.prototype)

			const watch = {}
			method_properties.filter(x => x.startsWith('watch_')).some(method_name => {
				const field_name = method_name.substr(6)
				const handler = function(...args) {
					return ComponentClass.prototype[method_name].bind(this)(...args)
				}
				watch[field_name] = handler
			})

			const methods = {}
			method_properties.filter(x => !x.startsWith('watch_')).some(method_name => {
				const handler = function(...args) {
					return ComponentClass.prototype[method_name].bind(this)(...args)
				}
				methods[method_name] = handler
			})

			Vue.component(ComponentClass.selector, {
				props: ComponentClass.props,
				data: () => {
					return new ComponentClass()
				},
				watch,
				methods,
				template: ComponentClass.template,
				created: function() {
					if ( typeof this.vue_on_create === 'function' ) this.vue_on_create()
				},
				updated: function() {
					if ( typeof this.vue_on_update === 'function' ) this.vue_on_update()
				},
				mounted: function() {
					if ( typeof this.vue_on_mount === 'function' ) this.vue_on_mount()
				},
				destroyed: function() {
					if ( typeof this.vue_on_destroy === 'function' ) this.vue_on_destroy()
				},
			})
		}
	}
}

export class Component {
	static get selector() { return '' }
	static get template() { return '' }
	static get props() { return [] }

	vue_on_create() {}
	vue_on_update() {}
	vue_on_mount() {}
	vue_on_destroy() {}
}