package controllers;

import java.net.URL;
import java.util.ArrayList;
import java.util.ResourceBundle;


import application.Main;
import com.jfoenix.controls.JFXButton;
import com.jfoenix.controls.JFXDialog;
import com.jfoenix.controls.JFXDialogLayout;
import com.jfoenix.controls.JFXTextField;
import com.jfoenix.controls.JFXTreeTableColumn;
import com.jfoenix.controls.JFXTreeTableView;
import com.jfoenix.controls.RecursiveTreeItem;
import com.jfoenix.controls.datamodels.treetable.RecursiveTreeObject;

import database.HistoryManagment;
import database.SqliteConnection;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.Node;
import javafx.scene.chart.PieChart;
import javafx.scene.control.Label;
import javafx.scene.control.TreeCell;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeTableColumn;
import javafx.scene.control.TreeTableColumn.CellDataFeatures;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.control.TreeView;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.text.Text;
import javafx.util.Callback;
import javafx.util.Duration;
import org.controlsfx.control.Notifications;
import userInterface.HistoryTree;

public class HistoryController implements Initializable {

	@FXML
	private BorderPane borderPaneHistory;
	@FXML
	private JFXTreeTableView<HistoryStoreView> table;

	@FXML
	private Label selectedDeleteEntries;

	@FXML
	private JFXTextField search;

	@FXML
	private VBox paneForChart;

	@FXML
	private PieChart historyPieChart;

	@FXML
	private VBox vBox;

	@FXML
	private TreeView treeView;
	@FXML
	private HBox hBox;

	@FXML
	private JFXButton deleteSingle;

	private ArrayList<TreeItem> storeItems;

	private TreeItem rootItem;

	//email col check
	JFXTreeTableColumn<HistoryStoreView, String> emailCol = new JFXTreeTableColumn<HistoryStoreView, String>("Email");
	
	JFXTreeTableColumn<HistoryStoreView, String> dateCol = new JFXTreeTableColumn<HistoryStoreView, String>("Date");

	JFXTreeTableColumn<HistoryStoreView, String> linkCol = new JFXTreeTableColumn<HistoryStoreView, String>("Links");

	JFXTreeTableColumn<HistoryStoreView, String> timeCol = new JFXTreeTableColumn<HistoryStoreView, String>("Time");
	JFXTreeTableColumn<HistoryStoreView, String> domainCol = new JFXTreeTableColumn<HistoryStoreView, String>(
			"Domain Name");
	JFXTreeTableColumn<HistoryStoreView, String> titleCol = new JFXTreeTableColumn<HistoryStoreView, String>("Title");

	// private static TabPane tabPane;
	// Tab addTab;

	// Lists for maintaining different Histories
	private static ObservableList<HistoryStoreView> fullHistory = FXCollections.observableArrayList();
	private ObservableList<HistoryStoreView> pastHours = FXCollections.observableArrayList();
	private ObservableList<HistoryStoreView> todayHistory = FXCollections.observableArrayList();
	private ObservableList<HistoryStoreView> yesterdayHistory = FXCollections.observableArrayList();
	private ObservableList<HistoryStoreView> pastWeekHistory = FXCollections.observableArrayList();
	private ObservableList<HistoryStoreView> pastMonthHistory = FXCollections.observableArrayList();
	
	private Image folderImage = new Image(getClass().getResourceAsStream(Main.IMAGES+"folder.png"));

	private StringProperty selectedItem ;

	private boolean check = false;

	private ArrayList<String> selectedValues  = new ArrayList<>();;

	boolean daikh = false;

	public HistoryController() {
		// TODO Auto-generated constructor stub
	}
	
	@Override
	public void initialize(URL arg0, ResourceBundle arg1) {
		initializingView();
		initializeListsWithData();
		
		search.setPromptText("Search History");
		table.setEditable(false);
		table.setId("treetable");

		selectedDeleteEntries.setVisible(false);


		historyPieChart.setTitle("Most Visited Sites");
		ObservableList<PieChart.Data> pieChartData = FXCollections.observableArrayList(
				new PieChart.Data("Facebook", 30)
				,new PieChart.Data("Google", 60)
				,new PieChart.Data("Twitter", 20)
				,new PieChart.Data("Gmail", 30));

		historyPieChart.setData(pieChartData);

		table.setOnKeyPressed((event)->{

			if (event.isControlDown() ) {


				table.addEventHandler(MouseEvent.MOUSE_CLICKED, (e)->{
					daikh = true;
				});

				table.addEventHandler(MouseEvent.MOUSE_CLICKED, (e)->{
					if(daikh){
						try{
							selectedItem = table.getSelectionModel().getSelectedItem().getValue().link1;

							boolean entery = true;

							for (int a = 0; a < selectedValues.size(); a++) {
								if (selectedValues.get(a).equals(selectedItem.getValue())) {
									entery = false;

								}
							}

							if (entery==true) {
								selectedDeleteEntries.setVisible(true);
								selectedValues.add(selectedItem.getValue());
								selectedDeleteEntries.setText("Selected "+selectedValues.size());
								entery = false;
							}



						}catch (Exception tableEmpty){

							Notifications.create()
							.title("History ")
							.text("No row has been selected or you have selected \n"
									+ "same row again in history table.")
							.hideAfter(Duration.seconds(3))
							.showWarning();
							return;
						}
					}
				});

			}

		});

		table.addEventHandler(MouseEvent.MOUSE_CLICKED, (e)->{

			try{
				selectedItem = table.getSelectionModel().getSelectedItem().getValue().link1;

				boolean entery = true;

				for (int a = 0; a < selectedValues.size(); a++) {
					if (selectedValues.get(a).equals(selectedItem.getValue())) {
						entery = false;

					}
				}

				if (entery==true) {
					selectedDeleteEntries.setVisible(true);
					selectedValues.add(selectedItem.getValue());
					selectedDeleteEntries.setText("Selected "+selectedValues.size());

					entery = false;
				}



			}catch (Exception tableEmpty){

				Notifications.create()
				.title("History ")
				.text("No row has been selected or you have selected \n"
						+ "same row again in history table.")
				.hideAfter(Duration.seconds(3))
				.showWarning();
				return;
			}

		});

		deleteSingle.addEventHandler(MouseEvent.MOUSE_CLICKED, (e) -> {

			if (selectedValues.size()<=0) {
				System.out.println("Empty not selected");
				return;
			} else {
				for (int a = 0; a < selectedValues.size(); a++) {
					System.out.println(selectedValues.get(a));
					SqliteConnection.excuteQuery(selectedValues.get(a));
					selectedValues.remove(a);

					// Update the history table
					ObservableList<HistoryStoreView> fullHistory = FXCollections.observableArrayList();
					fullHistory = SqliteConnection.getFullHistory(fullHistory);
					addListInTable(fullHistory);
					table.refresh();
				}
			}

			selectedDeleteEntries.setVisible(false);

			/*			
			if(check){
				try{
				selectedItem = table.getSelectionModel().getSelectedItem().getValue().link1;
				}catch (Exception tableEmpty){
					System.out.println("Check table empty");
					Notifications.create()
					.title("History ")
					.text("You do not have data in your history.")
					.hideAfter(Duration.seconds(3))
					.showInformation();
					return;
				}


					SqliteConnection.excuteQuery(selectedItem.getValue());

					// Update the history table
					ObservableList<HistoryStoreView> fullHistory = FXCollections.observableArrayList();
					fullHistory = SqliteConnection.getFullHistory(fullHistory);
					addListInTable(fullHistory);
					table.refresh();

					Notifications.create()
					.title("Successfull")
					.text("Your selected entry has been removed from history.")
					.hideAfter(Duration.seconds(3))
					.showInformation();

					check = false;
			}else{

					Notifications.create()
					.title("Unsuccessfull")
					.text("You did not select any row. Please select \n any row  then delete.")
					.hideAfter(Duration.seconds(3))
					.showWarning();
				return;
			}
			 */
		});



		
	}


	public void initializeListsWithData() {
		pastHours = HistoryManagment.pastHoursHistory(pastHours, -1);
		todayHistory = HistoryManagment.getHistory(todayHistory, 0);
		yesterdayHistory = HistoryManagment.getHistory(yesterdayHistory, -1);
		pastWeekHistory = HistoryManagment.getHistory(pastWeekHistory, -7);
		pastMonthHistory = HistoryManagment.getHistory(pastMonthHistory, -30);

	}

	public void initializingView() {

		// Border pane left View
		storeItems = HistoryTree.getStoreItems();
		rootItem = new TreeItem("History",new ImageView(folderImage));
		rootItem.getChildren().addAll(storeItems);
		rootItem.setExpanded(true);
		treeView.setRoot(rootItem);
		treeView.addEventHandler(MouseEvent.MOUSE_CLICKED, (e)->{
			Node node = e.getPickResult().getIntersectedNode();
			// Accept clicks only on node cells, and not on empty spaces of the
			// TreeView
			if (node instanceof Text || (node instanceof TreeCell && ((TreeCell) node).getText() != null)) {
				String name = (String) ((TreeItem) treeView.getSelectionModel().getSelectedItem()).getValue();
				System.out.println(name);
				if (name.equals("History")) {
					addListInTable(fullHistory);

				}
				if (name.equals("Past hour")) {
					addListInTable(pastHours);
				}
				if (name.equals("Today")) {
					addListInTable(todayHistory);
				}

				if (name.equals("Yesterday")) {
					addListInTable(yesterdayHistory);
				}

				if (name.equals("Past Week")) {
					addListInTable(pastWeekHistory);
				}

				if (name.equals("Past Month")) {
					addListInTable(pastMonthHistory);
				}

				// table.setMinWidth(600);
				// table.setMaxWidth(800);
				// borderPaneHistory.setCenter(table);
			}

		});

		// Border pane Middle view
		fullHistory = HistoryManagment.fullHistoryShow(fullHistory);
		addListInTable(fullHistory);

	}


	public void addListInTable(ObservableList<HistoryStoreView> list) {
		
		emailCol.setPrefWidth(150);
		emailCol.setCellValueFactory(
				new Callback<CellDataFeatures<HistoryStoreView, String>, ObservableValue<String>>() {
					@Override
					public ObservableValue<String> call(CellDataFeatures<HistoryStoreView, String> param) {
						return param.getValue().getValue().email1;
					}
				});
		
		
		dateCol.setPrefWidth(150);
		dateCol.setCellValueFactory(
				new Callback<CellDataFeatures<HistoryStoreView, String>, ObservableValue<String>>() {
					@Override
					public ObservableValue<String> call(CellDataFeatures<HistoryStoreView, String> param) {
						return param.getValue().getValue().date1;
					}
				});
		
		linkCol.setPrefWidth(400);
		linkCol.setCellValueFactory(
				new Callback<CellDataFeatures<HistoryStoreView, String>, ObservableValue<String>>() {
					@Override
					public ObservableValue<String> call(CellDataFeatures<HistoryStoreView, String> param) {
						return param.getValue().getValue().link1;
					}
				});
		timeCol.setPrefWidth(150);
		timeCol.setCellValueFactory(
				new Callback<CellDataFeatures<HistoryStoreView, String>, ObservableValue<String>>() {
					@Override
					public ObservableValue<String> call(CellDataFeatures<HistoryStoreView, String> param) {
						return param.getValue().getValue().time1;
					}
				});
		domainCol.setPrefWidth(200);
		domainCol.setCellValueFactory(
				new Callback<CellDataFeatures<HistoryStoreView, String>, ObservableValue<String>>() {
					@Override
					public ObservableValue<String> call(CellDataFeatures<HistoryStoreView, String> param) {
						return param.getValue().getValue().domain1;
					}
				});
		titleCol.setPrefWidth(150);
		titleCol.setCellValueFactory(
				new Callback<CellDataFeatures<HistoryStoreView, String>, ObservableValue<String>>() {
					@Override
					public ObservableValue<String> call(CellDataFeatures<HistoryStoreView, String> param) {
						return param.getValue().getValue().title1;
					}
				});

		final TreeItem<HistoryStoreView> root = new RecursiveTreeItem<HistoryStoreView>(list,
				RecursiveTreeObject::getChildren);

		table.getColumns().setAll(emailCol,dateCol, linkCol, timeCol, domainCol, titleCol);
		table.setRoot(root);
		table.setShowRoot(false);

	}

	@FXML
	void deleteHistory(MouseEvent event) {

		// confirmation dialogue
		/*	Alert alert = new Alert(AlertType.CONFIRMATION);
		alert.setTitle("Confirmation Dialog");
		alert.setHeaderText("History");
		alert.setContentText("Are you want to delete all History ?");
		Optional<ButtonType> result = alert.showAndWait();*/

		JFXButton okBt = new JFXButton("Ok");
		JFXButton cancelBt = new JFXButton("Cancel");

		okBt.setId("mybutton");
		cancelBt.setId("mybutton");

		JFXDialogLayout content = new JFXDialogLayout();
		content.setHeading(new Text("Clear History"));
		content.setBody(new Text(" You are going to delete your complete history. After that\n"
				+ "you will not have any single url in your history. Click Ok \n"
				+ "to confirm or click cancel to main window."));
		JFXDialog historyWarn= new JFXDialog(Main.getPane(),content,JFXDialog.DialogTransition.CENTER);
		content.setActions(okBt,cancelBt);
		historyWarn.show();	

		okBt.addEventHandler(MouseEvent.MOUSE_CLICKED, (e6) -> {

			historyWarn.close();

			JFXButton yesBt = new JFXButton("Yes");
			JFXButton noBt = new JFXButton("No");

			JFXDialogLayout confirmContent = new JFXDialogLayout();
			confirmContent.setHeading(new Text("Clear History"));
			confirmContent.setBody(new Text("Do you want to delete your complete history?"));
			JFXDialog historyConfirm = new JFXDialog(Main.getPane(), confirmContent, JFXDialog.DialogTransition.CENTER);
			confirmContent.setActions(yesBt, noBt);
			historyConfirm.show();

			yesBt.addEventHandler(MouseEvent.MOUSE_CLICKED, (e7) -> {

				table.setRoot(null);
				table.refresh();
				fullHistory.clear();
				pastHours.clear();
				pastMonthHistory.clear();
				pastWeekHistory.clear();
				yesterdayHistory.clear();
				todayHistory.clear();
				historyConfirm.close();

				HistoryManagment.deleteFromDatabase();

			});

			noBt.addEventHandler(MouseEvent.MOUSE_CLICKED, (e7) -> {
				historyConfirm.close();
			});

		});
		cancelBt.addEventHandler(MouseEvent.MOUSE_CLICKED, (e6) -> {
			historyWarn.close();
		});


		//To show overlay dialougge box

		/*
		if (alert.getResult() == ButtonType.OK) {


			// information dialogue
			alert = new Alert(AlertType.INFORMATION);
			alert.setTitle("History");
			alert.setHeaderText(null);
			String s = "History has been deleted!";
			alert.setContentText(s);
			alert.show();
		}*/


	}

	@FXML
	public void SearchDataInTable() {
		System.out.println("lalala");
		search.textProperty().addListener((o, oldVal, newVal) -> {
			table.setPredicate(HistoryStoreView -> HistoryStoreView.getValue().time1.get().contains(newVal)
					|| HistoryStoreView.getValue().date1.get().contains(newVal)
					|| HistoryStoreView.getValue().link1.get().contains(newVal));
		});

	}


	public static ObservableList addDataInList(String email, String link, String time, String date, String domain, String title,
			ObservableList list) {
		list.add(new HistoryStoreView(email,date, link, time, domain, title));
		return list;
	}

}


	

class HistoryStoreView extends RecursiveTreeObject<HistoryStoreView> {
	
	StringProperty email1;
	StringProperty date1;
	StringProperty link1;
	StringProperty time1;
	StringProperty domain1;
	StringProperty title1;

	public HistoryStoreView(String email,String date, String link, String time, String domain, String title) {
		
		
		this.email1 = new SimpleStringProperty(email);
		this.date1 = new SimpleStringProperty(date);
		this.link1 = new SimpleStringProperty(link);
		this.time1 = new SimpleStringProperty(time);
		this.domain1 = new SimpleStringProperty(domain);
		this.title1 = new SimpleStringProperty(title);
	}
}

// method call to fetch the data from history table.

// ----------------------------------------plugging different Views in the
// GUI-------------------------------------------//