package com.giffing.wicket.spring.boot.starter.configuration.extensions.stuff.datastore.hazelcast;

import org.apache.wicket.DefaultPageManagerProvider;
import org.apache.wicket.pageStore.IDataStore;
import org.apache.wicket.protocol.http.WebApplication;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.hazelcast.HazelcastAutoConfiguration;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.wicketstuff.datastores.common.SessionQuotaManagingDataStore;
import org.wicketstuff.datastores.hazelcast.HazelcastDataStore;

import com.giffing.wicket.spring.boot.context.extensions.ApplicationInitExtension;
import com.giffing.wicket.spring.boot.context.extensions.WicketApplicationInitConfiguration;
import com.giffing.wicket.spring.boot.context.extensions.boot.actuator.WicketAutoConfig;
import com.giffing.wicket.spring.boot.context.extensions.boot.actuator.WicketEndpointRepository;
import com.giffing.wicket.spring.boot.context.extensions.types.TypeParser;
import com.hazelcast.core.HazelcastInstance;

/**
 * Data store auto configuration for the hazelcast database
 * 
 * Enables hazelcast data store if the following two condition matches:
 * 
 * 1. The {@link HazelcastInstance} is in the classpath.
 * 
 * 2. The property {@link DataStoreHazelcastProperties#PROPERTY_PREFIX}.enabled
 * is true (default = true)
 * 
 * 
 * @author Marc Giffing
 *
 */
@ApplicationInitExtension
@ConditionalOnProperty(prefix = DataStoreHazelcastProperties.PROPERTY_PREFIX, value = "enabled", matchIfMissing = true)
@ConditionalOnBean(HazelcastInstance.class)
@ConditionalOnClass({HazelcastInstance.class, HazelcastDataStore.class})
@EnableConfigurationProperties({ DataStoreHazelcastProperties.class })
@AutoConfigureAfter(HazelcastAutoConfiguration.class)
public class DataStoreHazelcastConfig implements WicketApplicationInitConfiguration {

	@Autowired
	private DataStoreHazelcastProperties prop;
	
	@Autowired
	private HazelcastInstance hazelcastInstance;
	
	@Autowired
	private WicketEndpointRepository wicketEndpointRepository;

	@Override
	public void init(WebApplication webApplication) {
		
		webApplication.setPageManagerProvider(new DefaultPageManagerProvider(webApplication) {
			@Override
			protected IDataStore newDataStore() {
				HazelcastDataStore hazelcastDataStore = new HazelcastDataStore(hazelcastInstance);
				return new SessionQuotaManagingDataStore(hazelcastDataStore, TypeParser.parse(prop.getSessionSize(), prop.getSessionUnit()));
			}
		});
		
		wicketEndpointRepository.add(new WicketAutoConfig.Builder(this.getClass())
				.withDetail("properties", prop)
				.build());

	}

}