package ch.epfl.alpano;

import java.io.File;

import javax.imageio.ImageIO;

import ch.epfl.alpano.dem.ContinuousElevationModel;
import ch.epfl.alpano.dem.DiscreteElevationModel;
import ch.epfl.alpano.dem.HgtDiscreteElevationModel;
import ch.epfl.alpano.gui.ChannelPainter;
import ch.epfl.alpano.gui.ImagePainter;
import ch.epfl.alpano.gui.PanoramaRenderer;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.image.Image;
import static java.lang.Math.toRadians;

final class DrawPanoramaNew {
    final static File HGT_FILE = new File("HGT"+File.separatorChar+"N46E007.hgt");

    final static int IMAGE_WIDTH = 2_500;
    final static int IMAGE_HEIGHT = 800;

    final static double ORIGIN_LON = toRadians(7.65);
    final static double ORIGIN_LAT = toRadians(46.73);
    final static int ELEVATION = 600;
    final static double CENTER_AZIMUTH = toRadians(180);
    final static double HORIZONTAL_FOV = toRadians(110);
    final static int MAX_DISTANCE = 100_000;

    final static PanoramaParameters PARAMS =
            new PanoramaParameters(new GeoPoint(ORIGIN_LON,
                    ORIGIN_LAT),
                    ELEVATION,
                    CENTER_AZIMUTH,
                    HORIZONTAL_FOV,
                    MAX_DISTANCE,
                    IMAGE_WIDTH,
                    IMAGE_HEIGHT);

    public static void main(String[] as) throws Exception {
        try (DiscreteElevationModel dDEM =
                new HgtDiscreteElevationModel(HGT_FILE)) {
            ContinuousElevationModel cDEM =
                    new ContinuousElevationModel(dDEM);
            Panorama p = new PanoramaComputer(cDEM)
                    .computePanorama(PARAMS);

            ChannelPainter d = p::distanceAt;
            ChannelPainter sl = p::slopeAt;
            ChannelPainter h = d.div(100000).cycling().mul(360);
            ChannelPainter s = d.div(200000).clamped().inverted();
            ChannelPainter b = sl.mul(2).div(Math.PI).inverted().mul(0.7).add(0.3);
            ChannelPainter o =
                    d.map(dist -> dist == Float.POSITIVE_INFINITY ? 0 : 1);

            ImagePainter l = ImagePainter.hsb(h, s, b, o);

                  Image i = PanoramaRenderer.renderPanorama(p, l);
                  ImageIO.write(SwingFXUtils.fromFXImage(i, null),
                                "png",
                    new File("tests/ch/epfl/alpano/niesen-profile.png"));

        }

    }
}