/*******************************************************************************
 * Copyright (c) 2020 Dirk Fauth and others.
 *
 * This program and the accompanying materials are made
 * available under the terms of the Eclipse Public License 2.0
 * which is available at https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     Dirk Fauth <dirk.fauth@googlemail.com> - initial API and implementation
 ******************************************************************************/
package org.eclipse.nebula.widgets.nattable.ui.scaling;

import java.util.function.Consumer;

import org.eclipse.nebula.widgets.nattable.NatTable;
import org.eclipse.nebula.widgets.nattable.config.IConfigRegistry;
import org.eclipse.nebula.widgets.nattable.config.NatTableConfigAttributes;
import org.eclipse.nebula.widgets.nattable.layer.FixedScalingDpiConverter;
import org.eclipse.nebula.widgets.nattable.layer.IDpiConverter;
import org.eclipse.nebula.widgets.nattable.layer.command.ConfigureScalingCommand;
import org.eclipse.nebula.widgets.nattable.style.DisplayMode;

/**
 * Helper class for scaling calculations.
 *
 * @since 2.0
 */
public class ScalingUtil {

    /**
     * Performs a {@link ConfigureScalingCommand} to increase the scaling to
     * "zoom in" a NatTable.
     *
     * @param natTable
     *            The {@link NatTable} instance on which the zoom in operation
     *            should be performed.
     * @param registryUpdater
     *            Callback to trigger registry updates. Needed to re-register
     *            image cell painters for example.
     */
    public static void zoomIn(NatTable natTable, Consumer<IConfigRegistry> registryUpdater) {

        IConfigRegistry configRegistry = natTable.getConfigRegistry();

        IDpiConverter hDpiConverter = configRegistry.getConfigAttribute(
                NatTableConfigAttributes.HORIZONTAL_DPI_CONVERTER,
                DisplayMode.NORMAL);
        int hdpi = hDpiConverter.getDpi();
        int newHorizontalDpi = getNewZoomInDPI(hdpi);

        IDpiConverter vDpiConverter = configRegistry.getConfigAttribute(
                NatTableConfigAttributes.VERTICAL_DPI_CONVERTER,
                DisplayMode.NORMAL);
        int vdpi = vDpiConverter.getDpi();
        int newVerticalDpi = getNewZoomInDPI(vdpi);

        // only perform an update if dpi values have changed
        if (hdpi != newHorizontalDpi || vdpi != newVerticalDpi) {
            natTable.doCommand(new ConfigureScalingCommand(
                    new FixedScalingDpiConverter(newHorizontalDpi),
                    new FixedScalingDpiConverter(newVerticalDpi)));

            if (registryUpdater != null) {
                registryUpdater.accept(configRegistry);
            }

            natTable.refresh(false);
        }
    }

    /**
     * Performs a {@link ConfigureScalingCommand} to decrease the scaling to
     * "zoom out" a NatTable.
     *
     * @param natTable
     *            The {@link NatTable} instance on which the zoom in operation
     *            should be performed.
     * @param registryUpdater
     *            Callback to trigger registry updates. Needed to re-register
     *            image cell painters for example.
     */
    public static void zoomOut(NatTable natTable, Consumer<IConfigRegistry> registryUpdater) {

        IConfigRegistry configRegistry = natTable.getConfigRegistry();

        IDpiConverter hDpiConverter = configRegistry.getConfigAttribute(
                NatTableConfigAttributes.HORIZONTAL_DPI_CONVERTER,
                DisplayMode.NORMAL);
        int hdpi = hDpiConverter.getDpi();
        int newHorizontalDpi = getNewZoomOutDPI(hdpi);

        IDpiConverter vDpiConverter = configRegistry.getConfigAttribute(
                NatTableConfigAttributes.VERTICAL_DPI_CONVERTER,
                DisplayMode.NORMAL);
        int vdpi = vDpiConverter.getDpi();
        int newVerticalDpi = getNewZoomOutDPI(vdpi);

        // only perform an update if dpi values have changed
        if (hdpi != newHorizontalDpi || vdpi != newVerticalDpi) {
            natTable.doCommand(new ConfigureScalingCommand(
                    new FixedScalingDpiConverter(newHorizontalDpi),
                    new FixedScalingDpiConverter(newVerticalDpi)));

            if (registryUpdater != null) {
                registryUpdater.accept(configRegistry);
            }

            natTable.refresh(false);
        }
    }

    /**
     * Get the new DPI value for zoom out based on the given DPI value. The
     * minimum value is 12.
     *
     * @param currentDPI
     *            The current active DPI value.
     * @return The new DPI value for zooming out.
     */
    public static int getNewZoomOutDPI(int currentDPI) {
        int dpi = currentDPI;
        if (currentDPI == 288) {
            dpi = 192;
        } else if (currentDPI == 192) {
            dpi = 144;
        } else if (currentDPI == 144) {
            dpi = 120;
        } else if (currentDPI == 120) {
            dpi = 96;
        } else if (currentDPI <= 96) {
            dpi = Math.max(12, dpi / 2);
        }
        return dpi;
    }

    /**
     * Get the new DPI value for zoom in based on the given DPI value. The
     * maximum value is 288.
     *
     * @param currentDPI
     *            The current active DPI value.
     * @return The new DPI value for zooming in.
     */
    public static int getNewZoomInDPI(int currentDPI) {
        int dpi = currentDPI;
        if (currentDPI == 192) {
            dpi = 288;
        } else if (currentDPI == 144) {
            dpi = 192;
        } else if (currentDPI == 120) {
            dpi = 144;
        } else if (currentDPI == 96) {
            dpi = 120;
        } else if (currentDPI < 96) {
            dpi = dpi * 2;
        }

        return dpi;
    }

}
