package GUI.Views;

import GUI.Components.BottomBar;
import GUI.Components.FileContextMenu;
import GUI.Components.TopBar;
import GUI.Styler;
import Logger.Level;
import Logger.Logger;
import Server.ClientObject;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.Tooltip;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseButton;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.FlowPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

import java.io.IOException;


public class FileExplorerView {
    private static ClientObject client;

    private static void setClient(ClientObject client) {
        FileExplorerView.client = client;
    }

    private static String getExtensionImage(String s) {
        String extension = "";
        int i = s.lastIndexOf('.');
        if (i > 0) {
            extension = s.substring(i + 1);
        }
        /* Ignore the hideous switch statement, I will fix it later. */
        switch (extension) {
            case "":
                return "folder.png";
            case "ae":
                return "ae.png";
            case "br":
                return "br.png";
            case "cdr":
                return "cdr.png";
            case "csh":
                return "csh.png";
            case "css":
                return "css.png";
            case "csv":
                return "csv.png";
            case "dll":
                return "dll.png";
            case "doc":
            case "docx":
                return "doc.png";
            case "dw":
                return "dw.png";
            case "eps":
                return "eps.png";
            case "exe":
                return "exe.png";
            case "fla":
                return "fla.png";
            case "flac":
                return "flac.png";
            case "flv":
                return "flv.png";
            case "gif":
                return "gif.png";
            case "html":
                return "html.png";
            case "jpeg":
                return "jpeg.png";
            case "jpg":
                return "jpg.png";
            case "mkv":
                return "mkv.png";
            case "mobi":
                return "mobi.png";
            case "mov":
                return "mov.png";
            case "mp3":
                return "mp3.png";
            case "mpg":
                return "mpg.mp3";
            case "ot":
                return "ot.png";
            case "otf":
                return "otf.png";
            case "pdf":
                return "pdf.png";
            case "php":
                return "php.png";
            case "png":
                return "png.png";//lol
            case "ppt":
                return "ppt.png";
            case "ps":
                return "ps.png";
            case "psd":
                return "psd.png";
            case "rar":
                return "rar.png";
            case "rtf":
                return "rtf.png";
            case "svg":
                return "svg.png";
            case "tar":
                return "tar.png";
            case "tif":
                return "tif.png";
            case "ttf":
                return "ttf.png";
            case "txt":
                return "txt.png";
            case "wav":
                return "wav.png";
            case "wma":
                return "wma.png";
            case "xls":
                return "xls.png";
            case "zip":
                return "zip.png";
                /*Whew.*/
            default:
                return "file.png";
        }
    }

    public BorderPane getFileExplorerView(String pathName, String[] files, Stage stage, ClientObject client) {
        setClient(client);
        BorderPane borderPane = new BorderPane();
        borderPane.getStylesheets().add(getClass().getResource("/css/global.css").toExternalForm());
        borderPane.setTop(new TopBar().getTopBarSansOptions(stage));
        borderPane.setCenter(getFileExplorerViewCenter(pathName, files));
        borderPane.setBottom(new BottomBar().getBottomBar());
        return borderPane;
    }

    private ScrollPane getFileExplorerViewCenter(String pathName, String[] files) {
        pathName = pathName.replace("\\", "/");
        Button directoryUp = new Button("Up a directory");
        directoryUp.setOnAction(e -> {
            try {
                client.clientCommunicate("DIRECTORYUP");
            } catch (IOException e1) {
                Logger.log(Level.ERROR, e1.toString());
            }
        });
        Label title = (Label) Styler.styleAdd(new Label("Current Directory:"), "title");
        Label pathLabel = (Label) Styler.styleAdd(new Label(pathName), "label-bright");
        pathLabel.setWrapText(true);
        HBox pathNameBox = Styler.hContainer(5, Styler.vContainer(10, title, pathLabel, directoryUp));
        pathNameBox.setPrefHeight(100);
        pathNameBox.setPrefWidth(200);
        pathNameBox.setPadding(new Insets(5, 5, 5, 5));

        FlowPane flow = new FlowPane();
        flow.getChildren().add(pathNameBox);
        flow.setPadding(new Insets(10, 50, 10, 50));
        flow.getStylesheets().add(getClass().getResource("/css/global.css").toExternalForm());
        flow.setId("file-pane");
        flow.setVgap(10);
        flow.setHgap(10);
        flow.setAlignment(Pos.CENTER);
        HBox icons[] = new HBox[files.length];
        int rot = 0;
        for (String s : files) {
            HBox hBox = new HBox();
            hBox.setAlignment(Pos.CENTER);
            hBox.setPrefWidth(100);
            hBox.setPrefHeight(100);
            hBox.setId("file-icon");
            hBox.setPadding(new Insets(5, 5, 5, 5));
            VBox vBox = new VBox(5);
            vBox.setAlignment(Pos.CENTER);
            Label label;
            label = (Label) Styler.styleAdd(new Label(s), "label-bright");
            Tooltip t = new Tooltip(s);
            Tooltip.install(hBox, t);
            vBox.getChildren().addAll(new ImageView(new Image("/Images/Icons/FileExplorer/" + getExtensionImage(s))), label);
            hBox.getChildren().add(vBox);
            hBox.setOnMouseClicked(event -> {
                if (event.getButton().equals(MouseButton.SECONDARY)) {
                    if (getExtensionImage(s).contains("folder.png")) {
                        FileContextMenu.getDirectoryMenu(hBox, s, event, client);
                    } else {
                        FileContextMenu.getFileContextMenu(hBox, s, event, client);
                    }
                }
            });
            icons[rot] = hBox;
            flow.getChildren().add(icons[rot]);
            rot++;
        }
        ScrollPane scroll = new ScrollPane();
        scroll.setId("scroll-pane");
        scroll.setHbarPolicy(ScrollPane.ScrollBarPolicy.AS_NEEDED);    // Horizontal scroll bar
        scroll.setVbarPolicy(ScrollPane.ScrollBarPolicy.AS_NEEDED);    // Vertical scroll bar
        scroll.setContent(flow);
        scroll.viewportBoundsProperty().addListener((ov, oldBounds, bounds) -> {
            flow.setPrefWidth(bounds.getWidth());
            flow.setPrefHeight(bounds.getHeight());
        });
        return scroll;
    }

}