/*
 * Copyright (c) 2021 Martin Davis, and others.
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * and Eclipse Distribution License v. 1.0 which accompanies this distribution.
 * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v20.html
 * and the Eclipse Distribution License is available at
 *
 * http://www.eclipse.org/org/documents/edl-v10.php.
 */
package org.locationtech.jtstest.testbuilder;

import java.io.File;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;

import org.locationtech.jts.geom.Geometry;
import org.locationtech.jts.io.ParseException;
import org.locationtech.jts.util.Assert;
import org.locationtech.jtstest.testbuilder.io.HtmlSvgTestWriter;
import org.locationtech.jtstest.testbuilder.io.HtmlWriter;
import org.locationtech.jtstest.testbuilder.io.JavaTestWriter;
import org.locationtech.jtstest.testbuilder.io.XMLTestWriter;
import org.locationtech.jtstest.testbuilder.model.TestBuilderModel;
import org.locationtech.jtstest.testbuilder.ui.SwingUtil;
import org.locationtech.jtstest.testrunner.GuiUtil;
import org.locationtech.jtstest.util.FileUtil;

public class TestBuilderDialogs {

  private static JFileChooser directoryChooser = new JFileChooser();;
  private static JFileChooser fileChooser = new JFileChooser();;
  
  public static void saveAsXML(JTSTestBuilderFrame tbFrame, TestBuilderModel tbModel) {
    try {
      fileChooser.removeChoosableFileFilter(SwingUtil.JAVA_FILE_FILTER);
      fileChooser.addChoosableFileFilter(SwingUtil.XML_FILE_FILTER);
      fileChooser.setDialogTitle("Save XML Test File");
      if (JFileChooser.APPROVE_OPTION == fileChooser.showSaveDialog(tbFrame)) {
        File file = fileChooser.getSelectedFile();
        if (! SwingUtil.confirmOverwrite(tbFrame, file)) return;
        FileUtil.setContents(fileChooser.getSelectedFile().getPath(), 
            XMLTestWriter.getRunXml(tbModel.getTestCaseList(), tbModel.getPrecisionModel()) );
      }
    }
    catch (Exception x) {
      SwingUtil.reportException(tbFrame, x);
    }
  }

  private static JFileChooser htmlFileChooser = null;

  private static String chooseSVGFile(JTSTestBuilderFrame tbFrame) {
    if (htmlFileChooser == null) {
      htmlFileChooser = new JFileChooser();
      htmlFileChooser.addChoosableFileFilter(SwingUtil.HTML_FILE_FILTER);
      htmlFileChooser.setDialogTitle("Save HTML-SVG Test File");
      htmlFileChooser.setSelectedFile(new File("geoms.html"));
    }
    if (JFileChooser.APPROVE_OPTION != htmlFileChooser.showSaveDialog(tbFrame)) 
      return null;
    File file = htmlFileChooser.getSelectedFile();
    if (! SwingUtil.confirmOverwrite(tbFrame, file)) 
      return null;
    return htmlFileChooser.getSelectedFile().getPath();
  }
  
  public static void saveAsHtmlSVG(JTSTestBuilderFrame tbFrame, TestBuilderModel tbModel) {
    try {
      String path = chooseSVGFile(tbFrame);
      if (path == null) return;
      FileUtil.setContents(path, 
          HtmlSvgTestWriter.writeTestSVG(tbModel.getTestCaseList()) );
    }
    catch (Exception x) {
      SwingUtil.reportException(tbFrame, x);
    }
  }

  public static void saveAsHtml(JTSTestBuilderFrame tbFrame, TestBuilderModel tbModel) {
    try {
      directoryChooser.setDialogTitle("Select Folder In Which To Save HTML and GIF Files");
      if (JFileChooser.APPROVE_OPTION == directoryChooser.showSaveDialog(tbFrame)) {
        int choice = JOptionPane.showConfirmDialog(tbFrame,
            "Would you like the spatial function images "
             + "to show the A and B geometries?", "Confirmation",
            JOptionPane.YES_NO_CANCEL_OPTION);
        final HtmlWriter writer = new HtmlWriter();
        switch (choice) {
          case JOptionPane.CANCEL_OPTION:
            return;
          case JOptionPane.YES_OPTION:
            writer.setShowingABwithSpatialFunction(true);
            break;
          case JOptionPane.NO_OPTION:
            writer.setShowingABwithSpatialFunction(false);
            break;
        }
        final File directory = directoryChooser.getSelectedFile();
        Assert.isTrue(directory.exists());
        //        BusyDialog.setOwner(this);
        //        BusyDialog busyDialog = new BusyDialog();
        //        writer.setBusyDialog(busyDialog);
        //        try {
        //          busyDialog.execute("Saving .html and .gif files", new BusyDialog.Executable() {
        //            public void execute() throws Exception {
        writer.write(directory, tbModel.getTestCaseList(), tbModel.getPrecisionModel());
        //            }
        //          });
        //        }
        //        catch (Exception e2) {
        //          System.out.println(busyDialog.getStackTrace());
        //          throw e2;
        //        }
      }
    }
    catch (Exception x) {
      SwingUtil.reportException(tbFrame, x);
    }
  }
  
  public static void saveAsJava(JTSTestBuilderFrame tbFrame, TestBuilderModel tbModel) {
    try {
      fileChooser.removeChoosableFileFilter(SwingUtil.XML_FILE_FILTER);
      fileChooser.addChoosableFileFilter(SwingUtil.JAVA_FILE_FILTER);
      fileChooser.setDialogTitle("Save Java File");
      if (JFileChooser.APPROVE_OPTION == fileChooser.showSaveDialog(tbFrame)) {
        File file = fileChooser.getSelectedFile();
        if (! SwingUtil.confirmOverwrite(tbFrame, file)) return;
        String className = fileChooser.getSelectedFile().getName();
        int extensionIndex = className.lastIndexOf(".");
        if (extensionIndex > 0) {
          className = className.substring(0, extensionIndex);
        }
        ;
        FileUtil.setContents(fileChooser.getSelectedFile().getPath(), JavaTestWriter.getRunJava(className, tbModel));
      }
    }
    catch (Exception x) {
      SwingUtil.reportException(tbFrame, x);
    }
  }
  
  public static void precisionModel(JTSTestBuilderFrame tbFrame) {
    try {
      PrecisionModelDialog precisionModelDialog = new PrecisionModelDialog(
          tbFrame, "Edit Precision Model", true);
      GuiUtil.center(precisionModelDialog, tbFrame);
      precisionModelDialog.setPrecisionModel(JTSTestBuilder.model().getPrecisionModel());
      precisionModelDialog.setVisible(true);
      
      JTSTestBuilder.model().changePrecisionModel(precisionModelDialog.getPrecisionModel());
      tbFrame.updatePrecisionModelDescription();
      tbFrame.geometryChanged();
    }
    catch (ParseException pe) {
      JTSTestBuilderFrame.reportException(pe);
    }
  }

  private static JFileChooser pngFileChooser;
  
  public static JFileChooser getSavePNGFileChooser() {
    if (pngFileChooser == null) {
      pngFileChooser = new JFileChooser();
      pngFileChooser.addChoosableFileFilter(SwingUtil.PNG_FILE_FILTER);
      pngFileChooser.setDialogTitle("Save PNG");
      pngFileChooser.setSelectedFile(new File("geoms.png"));
    }
    return pngFileChooser;
  }
  
  private static GeometryInspectorDialog geomInspectorDlg;

  public static void inspectGeometry(JTSTestBuilderFrame tbFrame, int geomIndex, Geometry geometry) {
    if (geomInspectorDlg == null) {
      geomInspectorDlg = new GeometryInspectorDialog(tbFrame);
    }
    geomInspectorDlg.setGeometry(geomIndex, geometry);
    geomInspectorDlg.setVisible(true);
  }
  
  private static TestCaseTextDialog testCaseTextDlg;
  
  public static void viewCaseText(JTSTestBuilderFrame tbFrame) {
    if (testCaseTextDlg == null) {
      testCaseTextDlg = new TestCaseTextDialog(tbFrame,
          "", true);
    }
    testCaseTextDlg.setTestCase(JTSTestBuilder.model().getCurrentCase());
    testCaseTextDlg.setVisible(true);
  }
  /**
   *  Help | About action performed
   */
  public static void showAbout(JTSTestBuilderFrame tbFrame) {
    JTSTestBuilder_AboutBox dlg = new JTSTestBuilder_AboutBox(tbFrame);
    java.awt.Dimension dlgSize = dlg.getPreferredSize();
    java.awt.Dimension frmSize = tbFrame.getSize();
    java.awt.Point loc = tbFrame.getLocation();
    dlg.setLocation((frmSize.width - dlgSize.width) / 2 + loc.x, (frmSize.height
         - dlgSize.height) / 2 + loc.y);
    dlg.setModal(true);
    dlg.setVisible(true);
  }
}
