package org.apache.maven.wagon.shared.http;

/*
 * 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.
 */

import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;

import org.apache.http.client.utils.URLEncodedUtils;

/**
 * Encoding utility.
 *
 * @since 2.7
 */
public class EncodingUtil
{
    /**
     * Parses and returns an encoded version of the given URL string.
     *
     * @param url Raw/decoded string form of a URL to parse/encode.
     * @return Parsed/encoded {@link URI} that represents the string form URL passed in.
     * @throws MalformedURLException
     * @throws URISyntaxException
     * @deprecated to be removed with 4.0.0
     */
    @Deprecated
    public static URI encodeURL( String url )
        throws MalformedURLException, URISyntaxException
    {
        URL urlObject = new URL( url );

        URI uriEncoded =
            new URI( urlObject.getProtocol(), //
                     urlObject.getAuthority(), //
                     urlObject.getPath(), //
                     urlObject.getQuery(), //
                     urlObject.getRef() );

        return uriEncoded;
    }

    /**
     * Parses and returns an encoded version of the given URL string.
     * Wraps the {@link MalformedURLException} and {@link URISyntaxException} in case the passed URL is invalid.
     *
     * @param url Raw/decoded string form of a URL to parse/encode.
     * @return Parsed/encoded URI (as string) that represents the
     * @throws IllegalArgumentException in case the URL string is invalid.
     * @deprecated To be remvoed with 4.0.0
     */
    @Deprecated
    public static String encodeURLToString( String url )
    {
        try
        {
            return encodeURL( url ).toString();
        }
        catch ( Exception e )
        {
            throw new IllegalArgumentException( String.format( "Error parsing url: %s", url ), e );
        }
    }

    /**
     * Parses and returns an encoded version of the given URL string alongside the given path.
     *
     * @param baseUrl Base URL to use when constructing the final URL. This has to be a valid URL already.
     * @param path Additional unencoded path to append at the end of the base path.
     * @return Composed URL (base + path) already encoded, separating the individual path segments by "/".
     * @since TODO
     */
    public static String encodeURLToString( String baseUrl, String path )
    {
        String[] pathSegments = path == null ? new String[0] : path.split( "/" );

        return encodeURLToString( baseUrl, pathSegments );
    }

    /**
     * Parses and returns an encoded version of the given URL string alongside the given path segments.
     *
     * @param baseUrl Base URL to use when constructing the final URL. This has to be a valid URL already.
     * @param pathSegments Additional unencoded path segments to append at the end of the base path.
     * @return Composed URL (base + path) already encoded, separating the individual path segments by "/".
     * @since TODO
     */
    public static String encodeURLToString( String baseUrl, String... pathSegments )
    {
        StringBuilder url = new StringBuilder( baseUrl );

        String[] segments = pathSegments == null ? new String[0] : pathSegments;

        String path = URLEncodedUtils.formatSegments( segments );

        if ( url.toString().endsWith( "/" ) && !path.isEmpty() )
        {
            url.deleteCharAt( url.length() - 1 );
        }

        url.append( path );

        return url.toString();
    }
}
