/*******************************************************************************
 * Copyright (c) 2010 Boeing.
 * 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:
 *     Boeing - initial API and implementation
 *******************************************************************************/
package org.eclipse.osee.ote.server.internal;

import java.io.File;
import java.io.FileOutputStream;
import java.rmi.RemoteException;
import java.util.Collection;
import java.util.Date;
import java.util.LinkedList;
import java.util.Properties;
import java.util.UUID;
import java.util.logging.Level;

import net.jini.core.lookup.ServiceID;
import net.jini.id.Uuid;
import net.jini.id.UuidFactory;

import org.eclipse.osee.framework.jdk.core.util.EnhancedProperties;
import org.eclipse.osee.framework.logging.OseeLog;
import org.eclipse.osee.ote.HostServerProperties;
import org.eclipse.osee.ote.core.ConnectionRequestResult;
import org.eclipse.osee.ote.core.IRemoteUserSession;
import org.eclipse.osee.ote.core.IUserSession;
import org.eclipse.osee.ote.core.OSEEPerson1_4;
import org.eclipse.osee.ote.core.OTESessionManager;
import org.eclipse.osee.ote.core.ReturnStatus;
import org.eclipse.osee.ote.core.ServiceUtility;
import org.eclipse.osee.ote.core.environment.TestEnvironmentConfig;
import org.eclipse.osee.ote.core.environment.interfaces.IHostTestEnvironment;
import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironment;
import org.eclipse.osee.ote.endpoint.OteUdpEndpoint;
import org.eclipse.osee.ote.io.OTEServerFolder;
import org.eclipse.osee.ote.message.MessageSystemTestEnvironment;
import org.eclipse.osee.ote.properties.OtePropertiesCore;
import org.eclipse.osee.ote.server.PropertyParamter;

public class OteService implements IHostTestEnvironment {

   private final ServiceID serviceID;
   private final EnhancedProperties enhancedProperties;
   private MessageSystemTestEnvironment currentEnvironment;
   private ITestEnvironment remoteEnvironment;
   private final EnvironmentCreationParameter environmentCreation;
//   private final IRuntimeLibraryManager runtimeLibraryManager;
//   private RegisteredServiceReference registeredServiceReference;
   private OTESessionManager oteSessions;
   
   
   public OteService(EnvironmentCreationParameter environmentCreation, OTESessionManager oteSessions, PropertyParamter parameterObject, EnhancedProperties properties, OteUdpEndpoint receiver) {
//      this.runtimeLibraryManager = runtimeLibraryManager;
      this.environmentCreation = environmentCreation;
      this.oteSessions = oteSessions;
      
      Uuid uuid = UuidFactory.generate();
      Long lsb = Long.valueOf(uuid.getLeastSignificantBits());
      Long msb = Long.valueOf(uuid.getMostSignificantBits());
      serviceID = new ServiceID(msb.longValue(), lsb.longValue());

      enhancedProperties = properties;
      enhancedProperties.setProperty(HostServerProperties.name.name(), environmentCreation.getServerTitle());
      enhancedProperties.setProperty(HostServerProperties.station.name(), parameterObject.getStation());
      enhancedProperties.setProperty(HostServerProperties.version.name(), parameterObject.getVersion());
      enhancedProperties.setProperty(HostServerProperties.type.name(), parameterObject.getType());
      enhancedProperties.setProperty(HostServerProperties.maxUsers.name(), Integer.toString(environmentCreation.getMaxUsersPerEnvironment()));
      enhancedProperties.setProperty(HostServerProperties.comment.name(), parameterObject.getComment());
      enhancedProperties.setProperty(HostServerProperties.date.name(), new Date().toString());
      enhancedProperties.setProperty(HostServerProperties.group.name(), "OSEE Test Environment");
      enhancedProperties.setProperty(HostServerProperties.owner.name(), OtePropertiesCore.userName.getValue());
      enhancedProperties.setProperty(HostServerProperties.id.name(), serviceID.toString());
      enhancedProperties.setProperty(HostServerProperties.isSim.name(), Boolean.toString(environmentCreation.isSimulated()));
//      enhancedProperties.setProperty(HostServerProperties.activeMq.name(), environmentCreation.getBroker().getUri().toString());
      try {
         String format = String.format("tcp://%s:%d", receiver.getLocalEndpoint().getAddress().getHostAddress(), receiver.getLocalEndpoint().getPort());
         if(OtePropertiesCore.httpPort.getValue() == null){
            enhancedProperties.setProperty(HostServerProperties.appServerURI.name(), format);
         } else {
            enhancedProperties.setProperty(HostServerProperties.appServerURI.name(), format);
         }
         enhancedProperties.setProperty(HostServerProperties.oteUdpEndpoint.name(), format);
      } catch (Exception e) {
         OseeLog.log(OteService.class, Level.SEVERE, "Failed to set the appServerURI", e);
      }
      
      OTEServerFolder service = ServiceUtility.getService(OTEServerFolder.class);
      if(service != null){
         File dir = service.getCurrentServerFolder();
         dir.mkdirs();
         if(dir.exists() && dir.isDirectory()){
            try{
               Properties serverProperties = new Properties();
               serverProperties.putAll(enhancedProperties.asMap());
               serverProperties.store(new FileOutputStream(new File(dir, "server.properties")), "");
               File running = new File(dir, ".running");
               running.createNewFile();
               running.deleteOnExit();
            } catch (Throwable th){
               th.printStackTrace();
            }
         }
      }
   }
   
//   @Override
//   public NodeInfo getBroker(){
//      return environmentCreation.getBroker();
//   }

   @Override
   public EnhancedProperties getProperties() throws RemoteException {
      return enhancedProperties;
   }

   @Override
   public ConnectionRequestResult requestEnvironment(IRemoteUserSession session, UUID sessionId, TestEnvironmentConfig config) throws RemoteException {
      try {
         OseeLog.log(OteService.class, Level.INFO,
            "received request for test environment from user " + session.getUser().getName());
         if (!isEnvironmentAvailable()) {
            createEnvironment();
         }
         
         oteSessions.add(sessionId, session);
         updateDynamicInfo();
         return new ConnectionRequestResult(remoteEnvironment, sessionId, new ReturnStatus("Success", true));
      } catch (Throwable ex) {
         OseeLog.log(OteService.class, Level.SEVERE,
            "Exception while requesting environment for user " + session.getUser().getName(), ex);
         throw new RemoteException("Exception while requesting environment for user ", ex);
      }
   }

   private void createEnvironment() throws Throwable {
      currentEnvironment = environmentCreation.createEnvironment();
      remoteEnvironment = environmentCreation.createRemoteTestEnvironment(currentEnvironment);
      currentEnvironment.startup(environmentCreation.getOutfileLocation());
   }

   private boolean isEnvironmentAvailable() {
      return remoteEnvironment != null;
   }

   public void updateDynamicInfo() throws RemoteException {
      Collection<OSEEPerson1_4> userList = new LinkedList<>();
      StringBuilder sb = new StringBuilder();
      if (isEnvironmentAvailable()) {
         for(UUID sessionId:oteSessions.get()){
            IUserSession session = oteSessions.get(sessionId);
            try {
               userList.add(session.getUser());
            } catch (Exception e) {
               OseeLog.log(OteService.class, Level.WARNING, e);
            }
         }
      }
      for (OSEEPerson1_4 person : userList) {
         sb.append(person.getName());
         sb.append(", ");
      }
      if (sb.length() > 2) {
         String list = sb.toString().substring(0, sb.length() - 2);
         environmentCreation.getServiceConnector().setProperty("user_list", list);
      } else {
         environmentCreation.getServiceConnector().setProperty("user_list", "N/A");
      }
//      if (registeredServiceReference != null) {
//         registeredServiceReference.update();
//      }
   }

   public ServiceID getServiceID() throws RemoteException {
      return serviceID;
   }

   public void kill() throws RemoteException {
      if(currentEnvironment != null){
         currentEnvironment.shutdown();
      }
   }

//   public void set(RegisteredServiceReference ref) {
//      this.registeredServiceReference = ref;
//   }

   @Override
   public void disconnect(UUID sessionId) throws RemoteException {
      if (currentEnvironment != null) {
         oteSessions.remove(sessionId);
         updateDynamicInfo();
      }
   }

   @Override
   public String getHttpURL() throws RemoteException {
      return (String)enhancedProperties.getProperty("appServerURI");
   }
   
}
