/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  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.  For additional information regarding
 * copyright in this work, please see the NOTICE file in the top level
 * directory of this distribution.
 */

package org.apache.roller.weblogger.planet.business;

import org.apache.roller.planet.business.MultiPlanetURLStrategy;
import org.apache.roller.weblogger.config.WebloggerRuntimeConfig;


/**
 * Override Planet's URL strategy for use within Roller.
 */
public class PlanetURLStrategy extends MultiPlanetURLStrategy {   
    
    
    /**
     * Get URL configured for Planet.
     * @param planet There's only one planet in Roller, so this is ignored.
     */
    @Override
    public String getPlanetURL(String planet) {
        StringBuilder url = new StringBuilder();
        url.append(WebloggerRuntimeConfig.getProperty("site.absoluteurl"));
        return url.toString();
    }
    
    
    /**
     * Get URL configured for Planet.
     * @param planet There's only one planet in Roller, so this is ignored.
     * @param group   Handle of planet group (or null for default group).
     * @param pageNum Page number of results to return.
     */
    @Override
    public String getPlanetGroupURL(String planet, String group, int pageNum) {

        StringBuilder url = new StringBuilder();
        String sep = "?";
        
        url.append(getPlanetURL(planet));
        if (group != null) {
            url.append(sep);
            url.append("group=").append(group);
            sep = "&";
        }
        
        if (pageNum > 0) {
            url.append(sep);
            url.append("page=");
            url.append(pageNum);
        }
        
        return url.toString();
    }
    
    
    /**
     * Get URL of planet group's newsfeed.
     * @param planet There's only one planet in Roller, so this is ignored.
     * @param group Handle of planet group (or null for default group).
     * @param format  Feed format to be returned (ignored, currently only RSS is supported).
     */
    @Override
    public String getPlanetGroupFeedURL(String planet, String group, String format) {
        
        StringBuilder url = new StringBuilder();
        String sep = "?";
        
        url.append(WebloggerRuntimeConfig.getAbsoluteContextURL());
        url.append("planetrss");

        if (group != null) {
            url.append(sep);
            url.append("group=").append(group);
        }
        
        return url.toString();
    }
    
    
    /**
     * Currently, Roller doesn't support OPML so this returns null.
     * @param planet There's only one planet in Roller, so this is ignored.
     * @param group Handle of planet group.
     */
    @Override
    public String getPlanetGroupOpmlURL(String planet, String group) {
        return null;
    }
}
