/*
 * Copyright (c) 2009-2012, 2015 Eike Stepper (Berlin, Germany) and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Eike Stepper - initial API and implementation
 *
 *  Initial Publication:
 *    Eclipse Magazin - http://www.eclipse-magazin.de
 */
package org.gastro.server.internal.web;

import org.eclipse.emf.cdo.eresource.CDOResource;
import org.eclipse.emf.cdo.net4j.CDONet4jSession;
import org.eclipse.emf.cdo.net4j.CDONet4jSessionConfiguration;
import org.eclipse.emf.cdo.net4j.CDONet4jUtil;
import org.eclipse.emf.cdo.server.IRepository;
import org.eclipse.emf.cdo.view.CDOView;

import org.eclipse.net4j.Net4jUtil;
import org.eclipse.net4j.acceptor.IAcceptor;
import org.eclipse.net4j.connector.IConnector;
import org.eclipse.net4j.util.StringUtil;
import org.eclipse.net4j.util.container.IPluginContainer;
import org.eclipse.net4j.util.io.IOUtil;
import org.eclipse.net4j.util.om.OMPlatform;

import org.apache.commons.lang.StringEscapeUtils;
import org.gastro.business.BusinessDay;
import org.gastro.inventory.MenuCard;
import org.gastro.server.GastroServer;

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

import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;

import templates.MenuCardTemplate;

/**
 * @author Eike Stepper
 */
public class GastroServlet extends HttpServlet
{
  private static final long serialVersionUID = 1L;

  private String restaurantName;

  private IAcceptor acceptor;

  private IConnector connector;

  private CDOView view;

  private MenuCard menuCard;

  private MenuCardTemplate template = MenuCardTemplate.create(StringUtil.NL);

  private IRepository repository;

  public GastroServlet()
  {
  }

  @Override
  public void init() throws ServletException
  {
    repository = GastroServer.getRepository();
    if (repository == null)
    {
      return;
    }

    OM.LOG.info("Gastro servlet initializing");
    String repositoryName = repository.getName();
    restaurantName = getRestaurantName();

    acceptor = Net4jUtil.getAcceptor(IPluginContainer.INSTANCE, "jvm", repositoryName);
    connector = Net4jUtil.getConnector(IPluginContainer.INSTANCE, "jvm", repositoryName);

    CDONet4jSessionConfiguration config = CDONet4jUtil.createNet4jSessionConfiguration();
    config.setConnector(connector);
    config.setRepositoryName(repositoryName);

    CDONet4jSession session = config.openNet4jSession();
    view = session.openView();
    super.init();
    OM.LOG.info("Gastro servlet initialized");
  }

  @Override
  public void destroy()
  {
    if (repository == null)
    {
      return;
    }

    OM.LOG.info("Gastro servlet destroying");
    if (view != null)
    {
      CDONet4jSession session = (CDONet4jSession)view.getSession();
      if (session != null)
      {
        session.close();
      }
    }

    if (connector != null)
    {
      connector.close();
    }

    if (acceptor != null)
    {
      acceptor.close();
    }

    super.destroy();
    OM.LOG.info("Gastro servlet destroyed");
  }

  public synchronized MenuCard getMenuCard()
  {
    if (menuCard == null)
    {
      SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
      String path = restaurantName + "/" + formatter.format(new Date());
      CDOResource resource = view.getResource(path);
      BusinessDay businessDay = (BusinessDay)resource.getContents().get(0);
      menuCard = businessDay.getMenuCard();
    }

    return menuCard;
  }

  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
  {
    doPost(req, resp);
  }

  @Override
  protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
  {
    PrintWriter writer = resp.getWriter();

    try
    {
      String html = template.generate(getMenuCard());
      writer.print(html);
    }
    finally
    {
      IOUtil.close(writer);
    }
  }

  public static String getRestaurantName() throws ServletException
  {
    try
    {
      String configPath = OMPlatform.INSTANCE.getProperty("servlet.config", "config/gastro.properties");
      // InputStream stream = new FileInputStream(configPath);
      InputStream stream = OM.BUNDLE.getInputStream(configPath);

      try
      {
        Properties properties = new Properties();
        properties.load(stream);
        return properties.getProperty("restaurant");
      }
      finally
      {
        stream.close();
      }
    }
    catch (IOException ex)
    {
      throw new ServletException(ex);
    }
  }

  public static String html(String value)
  {
    return StringEscapeUtils.escapeHtml(value);
  }

  public static String html(double value)
  {
    return html(NumberFormat.getCurrencyInstance().format(value));
  }
}
