/*
 * 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.myfaces.html5.behavior;

import java.util.HashMap;
import java.util.Map;

import javax.el.ValueExpression;
import javax.faces.application.ResourceDependencies;
import javax.faces.application.ResourceDependency;
import javax.faces.context.FacesContext;

import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFBehavior;
import org.apache.myfaces.html5.event.DropEvent;
import org.apache.myfaces.html5.event.DropListener;
import org.apache.myfaces.html5.handler.DropTargetBehaviorHandler;

/**
 * Provides Html5 drop functionality to its parent.
 * 
 * @author Ali Ok
 * 
 */
@ResourceDependencies(
{
        @ResourceDependency(name = "jsf.js", library = "javax.faces", target = "head"),
        @ResourceDependency(name = "common.js", library = "org.apache.myfaces.html5", target = "head"),
        @ResourceDependency(name = "dnd.js", library = "org.apache.myfaces.html5", target = "head")
})
@JSFBehavior(name = "fx:dropTarget", id = "org.apache.myfaces.html5.DropTargetBehavior")
public class DropTargetBehavior extends javax.faces.component.behavior.ClientBehaviorBase implements ValueExpressionHolder
{

    public static final String RENDERER_ID = "org.apache.myfaces.html5.DropTargetBehavior";
    
    private static final String ATTR_ACTION = "action";
    private static final String ATTR_TYPES = "types";
    private static final String ATTR_ACCEPT_MIME_TYPES = "acceptMimeTypes";
    private static final String ATTR_RERENDER = "rerender";

    private Map<String, ValueExpression> _valueExpressions = new HashMap<String, ValueExpression>();
    private ClientBehaviorDeltaStateHelper<DropTargetBehavior> deltaStateHelper = new ClientBehaviorDeltaStateHelper<DropTargetBehavior>(this);
    
    /**
     * Adds a {@link DropListener} to notify when a {@link DropEvent} occured. 
     */
    public void addDropTargetBehaviorListener(DropListener listener)
    {
        super.addBehaviorListener(listener);
    }

    /**
     * @see DropTargetBehavior#addBehaviorListener(javax.faces.event.BehaviorListener)
     */
    public void removeDropTargetBehaviorListener(DropListener listener)
    {
        removeBehaviorListener(listener);
    }

    @Override
    public String getRendererType()
    {
        return RENDERER_ID;
    }

    /**
     * @see DropTargetBehaviorHandler#_action
     */
    public String getAction()
    {
        return (String) deltaStateHelper.eval(ATTR_ACTION);
    }

    public void setAction(String action)
    {
        deltaStateHelper.put(ATTR_ACTION, action);
    }

    /**
     * @see DropTargetBehaviorHandler#_types
     */
    public Object getTypes()
    {
        return deltaStateHelper.eval(ATTR_TYPES);
    }

    public void setTypes(Object types)
    {
        deltaStateHelper.put(ATTR_TYPES, types);
    }

    /**
     * @see DropTargetBehaviorHandler#_acceptMimeTypes
     */
    public Object getAcceptMimeTypes()
    {
        return deltaStateHelper.eval(ATTR_ACCEPT_MIME_TYPES);
    }

    public void setAcceptMimeTypes(Object acceptMimeTypes)
    {
        deltaStateHelper.put(ATTR_ACCEPT_MIME_TYPES, acceptMimeTypes);
    }

    /**
     * @see DropTargetBehaviorHandler#_rerender
     */
    public Object getRerender()
    {
        return deltaStateHelper.eval(ATTR_RERENDER);
    }

    public void setRerender(Object rerender)
    {
        deltaStateHelper.put(ATTR_RERENDER, rerender);
    }

    
    public void setValueExpression(String name, ValueExpression item)
    {
        if (item == null)
        {
            getValueExpressionMap().remove(name);
            deltaStateHelper.remove(name);
        }
        else
        {
            getValueExpressionMap().put(name, item);
        }
    }

    private Map<String, ValueExpression> getValueExpressionMap()
    {
        return _valueExpressions;
    }
    
    public ValueExpression getValueExpression(String name) 
    {
        return getValueExpressionMap().get(name);
    }
    
    @Override
    public void restoreState(FacesContext facesContext, Object o)
    {
        if (o == null)
        {
            return;
        }
        Object[] values = (Object[]) o;
        if (values[0] != null) 
        {
            super.restoreState(facesContext, values[0]);
        }
        deltaStateHelper.restoreState(facesContext, values[1]);
    }

    @Override
    public Object saveState(FacesContext facesContext)
    {
        if (initialStateMarked())
        {
            Object parentSaved = super.saveState(facesContext);
            Object deltaStateHelperSaved = deltaStateHelper.saveState(facesContext);
            
            if (parentSaved == null && deltaStateHelperSaved == null)
            {
                //No values
                return null;
            }   
            return new Object[]{parentSaved, deltaStateHelperSaved};
        }
        else
        {
            Object[] values = new Object[2];
            values[0] = super.saveState(facesContext);
            values[1] = deltaStateHelper.saveState(facesContext);
            return values;
        }
    }
}
