/*
 * 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.sis.referencing.cs;

import org.opengis.referencing.cs.AxisDirection;
import org.opengis.referencing.cs.CoordinateSystem;
import org.opengis.referencing.cs.CoordinateSystemAxis;
import javax.measure.Unit;


/**
 * Modifications to apply on the axes of a coordinate system in order to produce a new coordinate system.
 * {@code AxisFilter} can specify the axes to exclude in the new coordinate system, or specify different
 * units and directions associated to the axes.
 *
 * <div class="note"><b>Terminology note</b>
 * the word <cite>“filter”</cite> is understood here as <cite>“a computer program or subroutine to process a stream,
 * producing another stream”</cite> (<a href="http://en.wikipedia.org/wiki/Filter_%28software%29">Wikipedia</a>).
 * </div>
 *
 * <p>Note that filtering one or more axes may result in a change of coordinate system type.
 * For example excluding the <var>z</var> axis of a {@linkplain DefaultCylindricalCS cylindrical} coordinate system
 * results in a {@linkplain DefaultPolarCS polar} coordinate system.</p>
 *
 * <h2>Default implementation</h2>
 * All methods in this interface have a default implementation equivalent to <i>no-operation</i>.
 * Implementers need to override only the methods for the aspects to change.
 *
 * <h2>Limitations</h2>
 * This interface is not for changing axis order.
 * For changing axis order in addition to axis directions or units, see {@link AxesConvention}.
 *
 * @author  Martin Desruisseaux (Geomatys)
 * @version 0.7
 *
 * @see CoordinateSystems#replaceAxes(CoordinateSystem, AxisFilter)
 *
 * @since 0.6
 * @module
 */
public interface AxisFilter {
    /**
     * Returns {@code true} if the given axis shall be included in the new coordinate system.
     * The default implementation unconditionally returns {@code true}.
     *
     * @param  axis  the axis to test.
     * @return {@code true} if the given axis shall be included in the new coordinate system.
     */
    default boolean accept(CoordinateSystemAxis axis) {
        return true;
    }

    /**
     * Returns a replacement for the given axis direction.
     * The default implementation unconditionally returns the given {@code direction} unchanged.
     *
     * <div class="note"><b>Example:</b>
     * for forcing the direction of the <var>z</var> axis toward up while leaving other axes unchanged,
     * one can write:
     *
     * {@preformat java
     *     &#64;Override
     *     public getDirectionReplacement(CoordinateSystemAxis axis, AxisDirection direction) {
     *         if (direction == AxisDirection.DOWN) {
     *             direction = AxisDirection.UP;
     *         }
     *         return direction;
     *     }
     * }
     * </div>
     *
     * @param  axis       the axis for which to change axis direction, if desired.
     * @param  direction  the original axis direction.
     * @return the new axis direction, or {@code direction} if there is no change.
     *
     * @since 0.7
     */
    default AxisDirection getDirectionReplacement(CoordinateSystemAxis axis, AxisDirection direction) {
        return direction;
    }

    /**
     * Returns a replacement for the given axis unit.
     * The default implementation unconditionally returns the given {@code unit} unchanged.
     *
     * <div class="note"><b>Example:</b>
     * for replacing all angular units of a coordinate system to degrees (regardless what the original
     * angular units were) while leaving other kinds of units unchanged, one can write:
     *
     * {@preformat java
     *     &#64;Override
     *     public Unit<?> getUnitReplacement(CoordinateSystemAxis axis, Unit<?> unit) {
     *         if (Units.isAngular(unit)) {
     *             unit = Units.DEGREE;
     *         }
     *         return unit;
     *     }
     * }
     * </div>
     *
     * @param  axis  the axis for which to change unit, if desired.
     * @param  unit  the original axis unit.
     * @return the new axis unit, or {@code unit} if there is no change.
     *
     * @since 0.7
     */
    default Unit<?> getUnitReplacement(CoordinateSystemAxis axis, Unit<?> unit) {
        return unit;
    }
}
