package foundation.icall;

import foundation.dao.Filter;
import foundation.dao.OrderBy;
import foundation.data.entity.Entity;
import foundation.data.entity.EntitySet;
import foundation.data.mapping.FieldMapping;
import foundation.data.mapping.Mappings;
import foundation.data.object.DataObject;
import foundation.icall.callout.HttpServerMeta;
import foundation.icall.callout.RemoteDBMeta;
import foundation.icall.callout.RemoteSourceBucket;
import foundation.server.Initializer;


public class ICallLoader extends Initializer {
	
	@Override
	public void startUp() throws Exception {
		load();
	}

	@Override
	public void shutDown() throws Exception {
		
	}	
	
	public void load() throws Exception {
		//1. sources
		loadSources();
		
		//2. ICalls
		loadICalls();
	}

	private void loadSources() throws Exception {
		RemoteSourceBucket sourceBucket = RemoteSourceBucket.getInstance();
		
		loadRemoteDataBases(sourceBucket);
		loadHttpServers(sourceBucket);
	}

	public static void loadRemoteDataBases(RemoteSourceBucket sourceBucket) throws Exception {
		DataObject dataObject = DataObject.getInstance("sys_interface_source");
		EntitySet databaseList = dataObject.getTableEntitySet(new Filter("type", "database"));
		
		for (Entity entity : databaseList) {
			RemoteDBMeta meta = new RemoteDBMeta();
			meta.loadHead(entity);
			
			dataObject = DataObject.getInstance("sys_interface_source_detail");
			EntitySet elementList = dataObject.getTableEntitySet(new Filter("parent_id", entity.getId()));
			meta.loadDetail(elementList);
			
			sourceBucket.loadOne(meta.getName(), meta);
		}
	}

	public static void loadHttpServers(RemoteSourceBucket sourceBucket) throws Exception {
		DataObject dataObject = DataObject.getInstance("sys_interface_source");
		EntitySet databaseList = dataObject.getTableEntitySet(new Filter("type", "server"));
		
		for (Entity entity : databaseList) {
			HttpServerMeta meta = new HttpServerMeta();
			meta.load(entity);
			
			dataObject = DataObject.getInstance("sys_interface_source_detail");
			EntitySet elementList = dataObject.getTableEntitySet(new Filter("parent_id", entity.getId()));
			meta.loadItems(elementList);
			
			sourceBucket.loadOne(meta.getName(), meta);
		}
	}
	
	private void loadICalls() throws Exception {
		DataObject dataObject = DataObject.getInstance("sys_interface");
		EntitySet entitySet = dataObject.getBrowseEntitySet();
		
		ICallBucket bucket = ICallBucket.getInstance();
		
		for (Entity entity: entitySet) {
			ICallMeta meta = new ICallMeta();
			meta.load(entity);
			bucket.loadOne(meta.getName(), meta);
		}
		
		bucket.activate();
	}
	
	public static Mappings loadOneMappings(String mappingId, Mappings mappings) throws Exception {
		if (mappings == null) {
			mappings = new Mappings(mappingId);
		}
		else {
			mappings.clear();
		}
		
		DataObject dataObject = DataObject.getInstance("sys_interface_field");
		Filter filter = new Filter("parent_id", mappingId);
		EntitySet entitySet = dataObject.getTableEntitySet(filter, new OrderBy("index_no asc"));
		
		FieldMapping mapping;
		for (Entity entity: entitySet) {
			mapping = new FieldMapping();
			mapping.load(entity);
			
			mappings.loadOne(mapping);
		}
		
		return mappings;
	}

}