/*
 * 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.extensions.scripting.jsf2.resources;

import org.apache.myfaces.extensions.scripting.api.Decorated;

import javax.faces.application.Resource;
import javax.faces.application.ResourceHandler;
import javax.faces.context.FacesContext;
import java.io.IOException;
import java.net.URL;

/**
 * A simple delegating resource handler
 * which is supposed to pick up resources from a
 * given location if the Weaving configuration
 * has the parameter present
 */
public class SourceResourceHandler extends ResourceHandlerImpl implements Decorated {

    ResourceHandler _delegate = null;
    ResourceHandlerSupport _sourceHandlerSupport = null;

    public SourceResourceHandler(ResourceHandler delegate) {
        _delegate = delegate;
    }

    public Resource createResource(String resourceName) {
        Resource retVal = super.createResource(resourceName);
        if (retVal != null)
            return retVal;

        return _delegate.createResource(resourceName);
    }

    public Resource createResource(String resourceName, String libraryName) {
        Resource retVal = super.createResource(resourceName, libraryName);
        if (retVal != null)
            return retVal;

        return _delegate.createResource(resourceName, libraryName);
    }

    public Resource createResource(String resourceName, String libraryName, String contentType) {
        Resource retVal = super.createResource(resourceName, libraryName, contentType);

        if (retVal != null)
            return retVal;

        return _delegate.createResource(resourceName, libraryName, contentType);
    }

    public String getRendererTypeForResourceName(String resourceName) {

        String retVal = super.getRendererTypeForResourceName(resourceName);
        if (retVal != null)
            return retVal;

        return _delegate.getRendererTypeForResourceName(resourceName);
    }

    public void handleResourceRequest(FacesContext context) throws IOException {
        super.handleResourceRequest(context);
    }

    public boolean isResourceRequest(FacesContext context) {
        return _delegate.isResourceRequest(context);
    }

    public boolean libraryExists(String libraryName) {
        return _delegate.libraryExists(libraryName);
    }

    public ResourceHandler getDelegate() {
        return _delegate;
    }

    @Override
    /**
     * central override of this class it provides a new handler
     * support class which allows source pickups after the
     * JSF2 specified restful algorithms
     *
     * @return A support instance which allows also source pickups from resources additionally to the
     *              default deployment and jar pickups
     */
    protected ResourceHandlerSupport getResourceHandlerSupport() {
        if (_sourceHandlerSupport == null) {
            _sourceHandlerSupport = new SourceResourceHandlerSupport();
        }
        return _sourceHandlerSupport;
    }

    protected ResourceMeta deriveResourceMeta(ResourceLoader resourceLoader,
                                              String resourceName, String libraryName) {
        String localePrefix = getLocalePrefixForLocateResource();
        String resourceVersion = null;
        String libraryVersion = null;
        ResourceMeta resourceId = null;

        //1. Try to locate resource in a localized path
        if (localePrefix != null) {
            if (null != libraryName) {
                String pathToLib = localePrefix + '/' + libraryName;
                libraryVersion = resourceLoader.getLibraryVersion(pathToLib);

                if (null != libraryVersion) {
                    String pathToResource = localePrefix + '/'
                            + libraryName + '/' + libraryVersion + '/'
                            + resourceName;
                    resourceVersion = resourceLoader
                            .getResourceVersion(pathToResource);
                } else {
                    String pathToResource = localePrefix + '/'
                            + libraryName + '/' + resourceName;
                    resourceVersion = resourceLoader
                            .getResourceVersion(pathToResource);
                }

                if (!(resourceVersion != null && ResourceLoader.VERSION_INVALID.equals(resourceVersion))) {
                    resourceId = resourceLoader.createResourceMeta(localePrefix, libraryName,
                            libraryVersion, resourceName, resourceVersion);
                }
            } else {
                resourceVersion = resourceLoader
                        .getResourceVersion(localePrefix + '/' + resourceName);
                if (!(resourceVersion != null && ResourceLoader.VERSION_INVALID.equals(resourceVersion))) {
                    resourceId = resourceLoader.createResourceMeta(localePrefix, null, null,
                            resourceName, resourceVersion);
                } else if (resourceVersion == ResourceLoader.VERSION_INVALID) {
                    resourceId = resourceLoader.createResourceMeta(null, libraryName,
                            null, resourceName, null);
                }
            }

            if (resourceId != null) {
                URL url = resourceLoader.getResourceURL(resourceId);
                if (url == null) {
                    resourceId = null;
                }
            }
        }

        //2. Try to localize resource in a non localized path
        if (resourceId == null) {
            if (null != libraryName) {
                libraryVersion = resourceLoader.getLibraryVersion(libraryName);

                if (null != libraryVersion) {
                    String pathToResource = (libraryName + '/' + libraryVersion
                            + '/' + resourceName);
                    resourceVersion = resourceLoader
                            .getResourceVersion(pathToResource);
                } else {
                    String pathToResource = (libraryName + '/'
                            + resourceName);
                    resourceVersion = resourceLoader
                            .getResourceVersion(pathToResource);
                }

                if (!(resourceVersion != null && ResourceLoader.VERSION_INVALID.equals(resourceVersion))) {
                    resourceId = resourceLoader.createResourceMeta(null, libraryName,
                            libraryVersion, resourceName, resourceVersion);
                } else if (resourceVersion == ResourceLoader.VERSION_INVALID) {
                    resourceId = resourceLoader.createResourceMeta(null, libraryName,
                            libraryVersion, resourceName, null);
                }
            } else {
                resourceVersion = resourceLoader
                        .getResourceVersion(resourceName);

                if (!(resourceVersion != null && ResourceLoader.VERSION_INVALID.equals(resourceVersion))) {
                    resourceId = resourceLoader.createResourceMeta(null, null, null,
                            resourceName, resourceVersion);
                } else if (resourceVersion == ResourceLoader.VERSION_INVALID) {
                    resourceId = resourceLoader.createResourceMeta(null, null,
                            null, resourceName, null);
                }
            }

            if (resourceId != null) {
                URL url = resourceLoader.getResourceURL(resourceId);
                if (url == null) {
                    resourceId = null;
                }
            }
        }

        return resourceId;
    }
}
