/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License") +  you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package org.apache.openmeetings.servlet.outputhandler;

import java.io.File;
import java.io.StringWriter;
import java.util.LinkedHashMap;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.openmeetings.OpenmeetingsVariables;
import org.apache.openmeetings.data.basic.dao.ConfigurationDao;
import org.apache.openmeetings.documents.InstallationDocumentHandler;
import org.apache.openmeetings.installation.ImportInitvalues;
import org.apache.openmeetings.installation.InstallationConfig;
import org.apache.openmeetings.persistence.beans.basic.OmTimeZone;
import org.apache.openmeetings.servlet.BaseVelocityViewServlet;
import org.apache.openmeetings.servlet.ServerNotInitializedException;
import org.apache.openmeetings.utils.ImportHelper;
import org.apache.openmeetings.utils.OmFileHelper;
import org.apache.velocity.Template;
import org.apache.velocity.context.Context;
import org.red5.logging.Red5LoggerFactory;
import org.slf4j.Logger;

public class Install extends BaseVelocityViewServlet {
	
	private static final long serialVersionUID = 3684381243236013771L;

	private static final Logger log = Red5LoggerFactory.getLogger(
			Install.class, OpenmeetingsVariables.webAppRootKey);

	private Template getStep2Template(HttpServletRequest httpServletRequest, Context ctx, String lang) throws Exception {
		String header = httpServletRequest.getHeader("Accept-Language");
		String[] headerList = header != null ? header.split(",") : new String[0];
		String headCode = headerList.length > 0 ? headerList[0] : "en";
		
		LinkedHashMap<Integer, LinkedHashMap<String, Object>> allLanguagesAll = getBean(ImportInitvalues.class)
				.getLanguageFiles();
		LinkedHashMap<Integer, String> allLanguages = new LinkedHashMap<Integer, String>();
		//first iteration for preferred language
		Integer prefKey = -1;
		String prefName = null;
		for (Integer key : allLanguagesAll.keySet()) {
			String langName = (String) allLanguagesAll.get(key).get("name");
			String langCode = (String) allLanguagesAll.get(key).get("code");
			if (langCode != null) {
				if (headCode.equals(langCode)) {
					prefKey = key;
					prefName = langName;
					break;
				} else if (headCode.startsWith(langCode)) {
					prefKey = key;
					prefName = langName;
				}
			}
		}
		allLanguages.put(prefKey, prefName);
		for (Integer key : allLanguagesAll.keySet()) {
			String langName = (String) allLanguagesAll.get(key).get("name");
			if (key != prefKey) {
				allLanguages.put(key, langName);
			}
		}

		LinkedHashMap<String, String> allFonts = new LinkedHashMap<String, String>();
		allFonts.put("TimesNewRoman", "TimesNewRoman");
		allFonts.put("Verdana", "Verdana");
		allFonts.put("Arial", "Arial");

		List<OmTimeZone> omTimeZoneList = getBean(ImportInitvalues.class)
				.getTimeZones();

		Template tpl = super.getTemplate("install_step1_"
				+ lang + ".vm");
		ctx.put("allLanguages", allLanguages);
		ctx.put("allFonts", allFonts);
		ctx.put("allTimeZones", ImportHelper.getAllTimeZones(omTimeZoneList));
		StringWriter writer = new StringWriter();
		tpl.merge(ctx, writer);

		return tpl;
	}
	
	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest
	 * , javax.servlet.http.HttpServletResponse)
	 */
	@Override
	public Template handleRequest(HttpServletRequest request,
			HttpServletResponse response, Context ctx) {

		try {
			ctx.put("APP_ROOT", OpenmeetingsVariables.webAppRootKey);
			ctx.put("APP_NAME", getBean(ConfigurationDao.class).getAppName());
			String command = request.getParameter("command");

			String lang = request.getParameter("lang");
			if (lang == null)
				lang = "EN";

			File installerFile = OmFileHelper.getInstallFile();

			if (command == null || !installerFile.exists()) {
				log.debug("command equals null");

				if (!installerFile.exists()) {
					File confDir = OmFileHelper.getConfDir();
					boolean b = confDir.canWrite();

					if (!b) {
						// File could not be created so throw an error
						ctx.put("error",
								"Could not Create File, Permission set? ");
						ctx.put("path", confDir.getCanonicalPath());
						return getVelocityView().getVelocityEngine()
								.getTemplate("install_error_" + lang + ".vm");
					} else {
						InstallationDocumentHandler.createDocument(0);
						// File has been created so follow first step of
						// Installation
						return getVelocityView().getVelocityEngine()
								.getTemplate("install_welcome_" + lang + ".vm");
					}

				} else {
					int i = InstallationDocumentHandler.getCurrentStepNumber();
					if (i == 0) {
						return getStep2Template(request, ctx, lang);
					} else {
						return getVelocityView().getVelocityEngine()
								.getTemplate("install_step2_" + lang + ".vm");
					}
				}

			} else if (command.equals("step1")) {

				int i = InstallationDocumentHandler.getCurrentStepNumber();
				if (i == 0) {
					return getStep2Template(request, ctx, lang);
				} else {
					ctx.put("error",
							"This Step of the installation has already been done. continue with step 2 <A HREF='?command=step2'>continue with step 2</A>");
					return getVelocityView().getVelocityEngine().getTemplate(
							"install_exception_" + lang + ".vm");
				}

			} else if (command.equals("step2")) {

				int i = InstallationDocumentHandler.getCurrentStepNumber();
				if (i == 0) {

					log.debug("do init installation");

					InstallationConfig cfg = new InstallationConfig();
					cfg.username = request.getParameter("username");
					cfg.password = request.getParameter("userpass");
					cfg.group = request.getParameter("orgname");
					cfg.email = request.getParameter("useremail");
					cfg.allowFrontendRegister = request.getParameter("configdefault");

					cfg.mailReferer = request.getParameter("configreferer");
					cfg.smtpServer = request.getParameter("configsmtp");
					cfg.smtpPort = request.getParameter("configsmtpport");
					cfg.mailAuthName = request.getParameter("configmailuser");
					cfg.mailAuthPass = request.getParameter("configmailpass");
					cfg.mailUseTls = request.getParameter("mailusetls");
					cfg.replyToOrganizer = request.getParameter("replyToOrganizer");

					cfg.defaultLangId = request.getParameter("configdefaultLang");
					cfg.swfZoom = request.getParameter("swftools_zoom");
					cfg.swfJpegQuality = request.getParameter("swftools_jpegquality");
					cfg.swfPath = request.getParameter("swftools_path");
					cfg.imageMagicPath = request.getParameter("imagemagick_path");
					cfg.sendEmailAtRegister = request.getParameter("sendEmailAtRegister");
					cfg.sendEmailWithVerficationCode = request.getParameter("sendEmailWithVerficationCode");
					cfg.createDefaultRooms = request.getParameter("createDefaultRooms");

					cfg.defaultExportFont = request.getParameter("default_export_font");

					cfg.cryptClassName = request.getParameter("crypt_ClassName");

					cfg.ffmpegPath = request.getParameter("ffmpeg_path");

					cfg.soxPath = request.getParameter("sox_path");

                    // red5sip integration config
                    cfg.red5SipEnable = request.getParameter("red5sip_enable");
                    cfg.red5SipRoomPrefix = request.getParameter("red5sip_room_prefix");
                    cfg.red5SipExtenContext = request.getParameter("red5sip_exten_context");

					cfg.ical_timeZone = request.getParameter("timeZone");
					
					cfg.jodPath = request.getParameter("jod_path");

					log.debug("step 0+ start init with values. " + cfg.username
							+ " ***** " + cfg.email + " " + cfg.group + " "
							+ cfg);

					cfg.urlFeed = getServletContext().getInitParameter("url_feed");
					cfg.urlFeed2 = getServletContext().getInitParameter("url_feed2");
					
					getBean(ImportInitvalues.class).loadAll(cfg, false);

					// update to next step
					log.debug("add level to install file");
					InstallationDocumentHandler.createDocument(1);

					// return
					// getVelocityEngine().getTemplate("install_complete_"+lang+".vm");
					return getVelocityView().getVelocityEngine().getTemplate(
							"install_step2_" + lang + ".vm");
				} else {
					ctx.put("error",
							"This Step of the installation has already been done. continue with step 2 <A HREF='?command=step2'>continue with step 2</A>");
					return getVelocityView().getVelocityEngine().getTemplate(
							"install_exception_" + lang + ".vm");
				}

			} else if (command.equals("step")) {

				int i = InstallationDocumentHandler.getCurrentStepNumber();
				if (i == 0) {

				}

			}
		} catch (ServerNotInitializedException err) {
			return getBooting();
		} catch (Exception err2) {
			log.error("Install: ", err2);
		}

		return null;
	}

}
