/*******************************************************************************
 * Copyright (c) 2012 EclipseSource 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:
 *    EclipseSource - initial API and implementation
 ******************************************************************************/
package org.eclipse.rap.clientscripting.internal;

import java.util.Collection;

import org.eclipse.rap.clientscripting.ClientListener;
import org.eclipse.rap.rwt.RWT;
import org.eclipse.rap.rwt.internal.protocol.ClientObjectFactory;
import org.eclipse.rap.rwt.internal.protocol.IClientObject;
import org.eclipse.rap.rwt.lifecycle.PhaseEvent;
import org.eclipse.rap.rwt.lifecycle.PhaseId;
import org.eclipse.rap.rwt.lifecycle.PhaseListener;
import org.eclipse.rap.rwt.service.ApplicationContext;


@SuppressWarnings( { "restriction", "serial" } )
final class ClientScriptingRenderer {

  private static final String ATTR_RENDERING_PHASE_LISTENER
    = ClientScriptingRenderer.class.getName().concat( "#renderingPhaseListener" );
  private final static ClientListenerSynchronizer clientListenerSynchronizer;
  private final static ClientListenerBindingSynchronizer clientListenerBindingSynchronizer;
  private final static Object lock = new Object();

  static {
    clientListenerSynchronizer = new ClientListenerSynchronizer();
    clientListenerBindingSynchronizer = new ClientListenerBindingSynchronizer();
  }

  static void registerPhaseListener() {
    PhaseListener phaseListener;
    ApplicationContext context = RWT.getApplicationContext();
    synchronized( lock ) {
      phaseListener = ( PhaseListener )context.getAttribute( ATTR_RENDERING_PHASE_LISTENER );
      if( phaseListener == null ) {
        phaseListener = new RenderPhaseListener();
        RWT.getLifeCycle().addPhaseListener( phaseListener );
        context.setAttribute( ATTR_RENDERING_PHASE_LISTENER, phaseListener );
      }
    }
  }

  static void render() {
    ClientListenerManager manager = ClientListenerManager.getInstance();
    Collection<ClientListener> listeners = manager.getListeners();
    for( ClientListener listener : listeners ) {
      render( listener );
      ClientListenerAdapter listenerAdapter = listener.getAdapter( ClientListenerAdapter.class );
      Collection<ClientListenerBinding> bindings = listenerAdapter.getBindings();
      for( ClientListenerBinding binding : bindings ) {
        render( binding );
      }
      listenerAdapter.removeDisposedBindings();
    }
  }

  private static void render( ClientListener listener ) {
    IClientObjectAdapter2 adapter = listener.getAdapter( IClientObjectAdapter2.class );
    if( !adapter.isCreated() ) {
      IClientObject clientObject = ClientObjectFactory.getClientObject( listener );
      clientListenerSynchronizer.renderCreate( listener, clientObject );
      adapter.setCreated();
    }
  }

  private static void render( ClientListenerBinding binding ) {
    IClientObjectAdapter2 adapter = binding.getAdapter( IClientObjectAdapter2.class );
    if( !adapter.isCreated() ) {
      IClientObject clientObject = ClientObjectFactory.getClientObject( binding );
      clientListenerBindingSynchronizer.renderCreate( binding, clientObject );
      adapter.setCreated();
    }
    if( binding.isDisposed() ) {
      IClientObject clientObject = ClientObjectFactory.getClientObject( binding );
      clientListenerBindingSynchronizer.renderDestroy( binding, clientObject );
    }
  }

  private static class RenderPhaseListener implements PhaseListener {

    public PhaseId getPhaseId() {
      return PhaseId.RENDER;
    }

    public void beforePhase( PhaseEvent event ) {
    }

    public void afterPhase( PhaseEvent event ) {
      render();
    }
  }
}
