/**
 * $Id: MyWurflService.java 213 2010-06-09 12:50:28Z jblandin $
 */
package fr.univlr.Ticeur2.outils;

import net.sourceforge.wurfl.core.DefaultDeviceProvider;
import net.sourceforge.wurfl.core.DefaultWURFLHolder;
import net.sourceforge.wurfl.core.DefaultWURFLManager;
import net.sourceforge.wurfl.core.DefaultWURFLService;
import net.sourceforge.wurfl.core.Device;
import net.sourceforge.wurfl.core.WURFLHolder;
import net.sourceforge.wurfl.core.WURFLManager;
import net.sourceforge.wurfl.core.WURFLUtils;
import net.sourceforge.wurfl.core.handlers.matchers.MatcherManager;
import net.sourceforge.wurfl.core.resource.DefaultWURFLModel;
import net.sourceforge.wurfl.core.resource.WURFLResources;
import net.sourceforge.wurfl.core.resource.XMLResource;

import com.webobjects.foundation.NSDictionary;
import com.webobjects.foundation.NSLog;

import fr.univlr.Ticeur2.Application;
import fr.univlr.Ticeur2.Session;
import fr.univlr.cri.webapp.LRLog;

/**
 * @author Julien BLANDINEAU <jblandin@univ-lr.fr>
 * 
 */
public class MyWurflService {

	public final static String DEVICE_CLAIM_WEB_SUPPORT = "device_claims_web_support";
	public final static String DEVICE_OS = "device_os";
	public final static String DEVICE_OS_VERSION = "device_os_version";
	public final static String IS_WIRELESS_DEVICE = "is_wireless_device";
	public final static String MOBILE_BROWSER = "mobile_browser";
	public final static String MOBILE_BROWSER_VERSION = "mobile_browser_version";
	public final static String MODEL_NAME = "model_name";
	public final static String BRAND_NAME = "brand_name";

	public final static String IS_MOBILE = "is_mobile";

	private final WURFLHolder wurflHolder;

	private final DefaultWURFLModel model;

	/**
	 * Initialisation de la liste des navigateurs a partir du fichier XML WURFL
	 */
	public MyWurflService() {
		// --LOG
		NSLog.out.appendln();
		NSLog.out.appendln("Initialisation WURFL");
		NSLog.out.appendln("--------------------");
		LRLog.trace(" == Load Model");
		// -- FIN LOG

		// Le patch : http://wurfl.sourceforge.net/web_browsers_patch.xml
		WURFLResources patch = new WURFLResources();
		patch.add(new XMLResource(Application.getAppli().resourceManager().pathURLForResourceNamed("xml/wurfl_patch.xml", "app", null).getFile()));
		this.model = new DefaultWURFLModel(new XMLResource(Application.getAppli().resourceManager().pathURLForResourceNamed("xml/wurfl.xml", "app", null).getFile()), patch);
		LRLog.trace(" == Create Manager");
		MatcherManager matcherManager = new MatcherManager(this.model);
		LRLog.trace(" == Create Device Provider");
		DefaultDeviceProvider deviceProvider = new DefaultDeviceProvider(this.model);
		LRLog.trace(" == Create WURFL Service");
		DefaultWURFLService wurflService = new DefaultWURFLService(matcherManager, deviceProvider);
		LRLog.trace(" == Create WURFL Manager");
		WURFLManager wurflManager = new DefaultWURFLManager(wurflService);
		LRLog.trace(" == Create WURFL Utils");
		WURFLUtils wurflUtils = new WURFLUtils(this.model);
		LRLog.trace(" == Create WURFL Holder");
		this.wurflHolder = new DefaultWURFLHolder(wurflManager, wurflUtils);

		// -- LOG
		NSLog.out.appendln("  Version WURFL : ");
		String[] versions = wurflUtils.getVersion().split("; ");
		for (int i = 0; i < versions.length; i++) {
			String[] uneVersion = versions[i].split(":", 4);
			NSLog.out.appendln("    > " + uneVersion[0]);
			NSLog.out.appendln("        " + uneVersion[1] + ":" + uneVersion[2]);
			if (uneVersion.length == 4)
				NSLog.out.appendln("        " + uneVersion[3]);
		}
		NSLog.out.appendln();
		// -- FIN LOG
	}

	/**
	 * Detecte si le navigateur est un navigateur mobile
	 * 
	 * @param sess
	 *            la session
	 * @param request
	 *            la requette
	 * @return <b>TRUE</b> si le navigateur est un navigateur mobile<br />
	 *         <b>FALSE</b> sinon
	 */
	public boolean isMobileDevice(Session sess, String request) {
		LRLog.trace("IS MOBILE DEVICE");

		Device device = this.wurflHolder.getWURFLManager().getDeviceForRequest(request);
		// On enregistre le device dans la session
		sess.setDevice(device);
		if (device.getId().equals("generic"))
			return false;
		return device.getCapability(IS_WIRELESS_DEVICE).equals("true") || device.getCapability(DEVICE_CLAIM_WEB_SUPPORT).equals("false");
	}

	public NSDictionary getCapabilities(Device device) {
		NSDictionary newDic = new NSDictionary(device.getCapabilities(), true);
		return newDic;
	}

	/**
	 * @return the wurflHolder
	 */
	public WURFLHolder getWurflHolder() {
		return this.wurflHolder;
	}
}
