package hu.ppke.itk.java.hakta.hf08;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.Optional;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.TextField;
import javafx.scene.control.TextInputDialog;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Priority;
import javafx.scene.layout.RowConstraints;
import javafx.stage.Stage;

public class Main extends Application {
	
	TextField txtUrl = new TextField("http://index.hu");
	Button btnDownload = new Button("Download");
	Button btnSearch = new Button("Search");
	Label lbMetadata = new Label( "");
	Label lbHtml = new Label("");
	ScrollPane sp = new ScrollPane(lbHtml);
	String html, meta;

	public static void main(String[] args) {
		launch(args);
	}
	
	class Download implements Runnable {
		@Override
		public void run() {
			Platform.runLater(
				new Runnable() {
					@Override
					public void run() {
						lbMetadata.setText("Downloading...");
						sp.setVisible(false);
					}
				});
			try {
				URL url = new URL(txtUrl.getText());
				URLConnection conn = url.openConnection();
				
				meta = "Protocol: " + url.getProtocol();
				meta += "\nAuthority: " + url.getAuthority();
				meta += "\nHost: " + url.getHost();
				meta += "\nPort: " + url.getPort();
				meta += "\nPath: " + url.getPath();
				meta += "\nQuery: " + url.getQuery();
				meta += "\nFilename: " + url.getFile();
				meta += "\nref: " + url.getRef();
				
				BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
				html = "";
				while (br.ready())
					html += br.readLine() + "\n";
	
				Platform.runLater(
						new Runnable() {
							@Override
							public void run() {
								lbMetadata.setText(meta);
								lbHtml.setText(html);
								sp.setVisible(true);
							}
						});
				
			}catch (IOException e) {
				lbMetadata.setText(e.getMessage());
			}
		}
	}
	
	private void Search() {
		if (html.isEmpty()){
			Alert alert = new Alert(AlertType.WARNING);
			alert.setTitle("Error");
			alert.setContentText("There is no html file to perform the search on!");
			alert.showAndWait();
			return;
		}
		
		TextInputDialog dialog = new TextInputDialog("Search");
		dialog.setTitle("Search");
		dialog.setContentText("Enter words you want to look up in html file:");

		Optional<String> result = dialog.showAndWait();
		if (result.isPresent()) {
			Pattern pattern = Pattern.compile("(?m)(^.*?" + result.get() + ".*?$)");
			Matcher m = pattern.matcher(html);
			String resultText = "";
			while (m.find())
				resultText += m.group(1) + "\n";
			lbHtml.setText(resultText);
		}
	}

	@Override
	public void start(Stage primaryStage) throws Exception {
		GridPane g = new GridPane();
		GridPane top = new GridPane();
		
		top.add(txtUrl, 0, 0);
		top.add(btnDownload, 1, 0);
		top.add(btnSearch, 2, 0);
		GridPane.setHgrow(txtUrl, Priority.ALWAYS);
		top.setHgap(10d);
		top.setVgap(10d);
		top.setPadding(new Insets(5d));
		
		lbMetadata.setPadding(new Insets(5d));
		lbHtml.setPadding(new Insets(5d));
		sp.setVisible(false);
		
		btnDownload.setOnAction(e -> (new Thread(new Download())).start());
		btnSearch.setOnAction(e -> Search());
		
		g.add(top, 0, 0);
		g.add(lbMetadata, 0, 1);
		g.getRowConstraints().add(new RowConstraints());
		RowConstraints rc = new RowConstraints();
		rc.setMinHeight(150d);
		g.getRowConstraints().add(1, rc);
		g.add(sp, 0, 2);
		g.setVgap(5d);

		GridPane.setVgrow(sp, Priority.ALWAYS);
		
		primaryStage.setScene(new Scene(g));
	    primaryStage.setOnCloseRequest(event -> Platform.exit());
	    primaryStage.setTitle("URL downloader");
	    primaryStage.setMinHeight(500d);
	    primaryStage.setMinWidth(500d);
	    
	    primaryStage.show();
	}

}
